你需要的一個RecyclerView工具類

XavSalting 7年前發布 | 8K 次閱讀 Android開發 移動開發 RecyclerView

目前這個庫能支持的功能有:封裝好的Adapter、支持二級列表功能的Adapter、完善的分割線類(你確定你不是來釣魚的?)。項目地址是: https://github.com/DobbyTang/RecyclerUtil

SimpleAdapter

SimpleAdapter的作用是快速實現Adapter的開發,其中支持的功能是

  1. 快速添加頂部和底部,并且可以根據需要監聽底部和頂部的事件
  2. 維護列表數據
  3. 實現點擊事件
  4. 簡化開發的步驟
    其中SimpleAdapter的頂部和底部是依賴于RecyclerView的生命周期的,避免了內存溢出和在Fragment中的部分場景使用會導致崩潰的問題。

SecondaryAdapter

SecondaryAdapter的作用是實現一個支持二級列表功能的Adapter。可以用于一些特殊的場景中(購物車,二級分類列表等)。

SimpleDecoration

的是分割線類,它的作用的快速添加分割線并且支持多種效果。

  1. 線段分割線
  2. 透明分割線
  3. 自定義圖片分割線
  4. 自定義分割線的寬度

筆者在參考一些網上的分割線代碼的時候,發現當分割線的寬度過大的時候會出現一個問題:在使用表格類型的布局的時候,由于分割線會占用一定的空間,會影響第一個或最后一個item的大小。文字大家可能比較難以理解,可以看看下面的圖解:

從上圖可以看出問題所在。

分割線的繪制原理是通過重新計算Item所占的空間計算出分割線所占的位置,然后在這些位置上繪制線段實現的。上圖的縱向分割線筆者是通過在普通Item的右邊計算分割線的位置后繪制的,計算出item處于最后一列時則不繪制右邊的分割線。所以當item的列數為n的時候,縱向需要繪制的分割線為n - 1。

當分割線的寬度不大時這樣做時沒有問題的,但是當分割線的寬度比較大時,我們會發現由于在最后一列的位置上沒有繪制分割線,所以最后一列item的width值實際上是比其它的item要大的,這就造成了item的寬度不一致的問題。

SimpleDecoration解決了上述的問題,并且拓展了分割線的功能,我們可以看看SimpleDecoration的實際效果。

上圖中分割線的寬度時32dp,可以明顯看出各個item的大小都是一樣的。但是需要注意的是,因為我們縱向分割線的位置和大小都是重新計算過的,所以縱向分割線的寬度會比32dp大一點。

效果展示

由于時間關系,筆者寫了個簡單的demo供大家參考,如果大家有興趣的話可以去筆者的github中下載該項目。

使用方法

導入庫

首先在工程目錄下的build.gradle文件中的allprojects-> repositories下添加 maven { url 'https://jitpack.io' } 如下所示

allprojects {  
    repositories {  
        ...  
        maven { url 'https://jitpack.io' }  
    }  
}

然后在需要使用這個庫的module目錄下的build.gradle文件中添加依賴。

dependencies {  
        compile 'com.github.DobbyTang:RecyclerUtil:1.0.3'  
}

SimpleAdapter使用

public classTestSimpleAdapterextendsSimpleAdapter<UserBean>{  

    @Override  
    public RecyclerView.ViewHolder onCreateNormalView(ViewGroup parent) {  
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemuser,parent,false);  
        return new UserHolder(view);  
    }  

    @Override  
    public void onBindNormalView(RecyclerView.ViewHolder normalHolder, int position, UserBean value) {  
        ((UserHolder) normalHolder).name.setText(value.name);  
        ((UserHolder) normalHolder).age.setText(value.age + "");  
        ((UserHolder) normalHolder).sex.setText(value.sex);  
    }  


    private classUserHolderextendsRecyclerView.ViewHolder{  

        TextView name;  
        TextView age;  
        TextView sex;  

        public UserHolder(View itemView) {  
            super(itemView);  
            name = (TextView) itemView.findViewById(R.id.itemusername);  
            age = (TextView) itemView.findViewById(R.id.itemuserage);  
            sex = (TextView) itemView.findViewById(R.id.itemusersex);  
        }  
    }  

}

可以看出,SimpleAdapter的使用方法和普通的RecyclerView.Adapter的使用方法是差不多的,但是SimpleAdapter簡潔很多。 我們只定義一個ViewHolder,然后覆蓋onCreateNormalView()和onBindNormalView()方法就可以完成一個簡單的Adapter了。如果你想添加Header和footer的話也很簡單,只需要覆蓋 setHeaderView() 和 setFooterView() 方法就可以了。如果需要對header和footer進行監聽或數據綁定,只需要分別覆蓋 onBindHeaderView() 和 onBindFooterView() 即可。

完整代碼如下:

@Override  
public int setHeaderView() {  
    return R.layout.header_user;  
}  

@Override  
public int setFooterView() {  
    return R.layout.footer_user;  
}  

@Override  
public void onBindHeaderView(View header) {  
    header.findViewById(R.id.header_button)  
            .setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    Snackbar.make(v,"點擊Header上的Button",Snackbar.LENGTH_SHORT).show();  
                }  
    });  
}  

@Override  
public void onBindFooterView(View footer) {  
    footer.findViewById(R.id.footer_button)  
            .setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    Snackbar.make(v,"點擊Footer上的Button",Snackbar.LENGTH_SHORT).show();  
                }  
            });  
}

完成Adapter后的使用方法和普通的Apapter一樣。

adapter = new TestSimpleAdapter();
list.setLayoutManager(new LinearLayoutManager(getActivity()));
list.setAdapter(adapter);

當我們需要設置Adapter的數據時,只需要調用 SimpleAdapter 的 setData() 方法即可,更多的使用方法請查看源碼注釋。

SecondaryAdapter 使用

@Override  
public RecyclerView.ViewHolder onCreateGroupHolder(ViewGroup parent) {  
    View view = LayoutInflater.from(parent.getContext())  
            .inflate(R.layout.friendgroupitem,parent,false);  
    return new TitleHolder(view);  
}  

@Override  
public RecyclerView.ViewHolder onCreateChildHolder(ViewGroup parent) {  
    View view = LayoutInflater.from(parent.getContext())  
            .inflate(R.layout.friendsubitem,parent,false);  
    return new FriendHolder(view);  
}  

@Override  
public void onBindGroupHolder(RecyclerView.ViewHolder holder, FriendGroupBean friendGroupBean) {  
    ((TitleHolder)holder).groupName.setText(friendGroupBean.title);  
}  

@Override  
public void onBindChildHolder(RecyclerView.ViewHolder holder, UserBean userBean) {  
    ((FriendHolder) holder).name.setText(userBean.name);  
    ((FriendHolder) holder).age.setText(userBean.age + "");  
    ((FriendHolder) holder).sex.setText(userBean.sex);  
    if (userBean.imgId != 0){  
        ((FriendHolder) holder).avatar.setImageResource(userBean.imgId);  
    }else {  
        ((FriendHolder) holder).avatar.setImageResource(R.mipmap.iclauncher);  

    }  
}  

public static classTitleHolderextendsRecyclerView.ViewHolder{  

    TextView groupName;  

    public TitleHolder(View itemView) {  
        super(itemView);  
        groupName = (TextView) itemView.findViewById(R.id.title);  
    }  
}  

private classFriendHolderextendsRecyclerView.ViewHolder{  

    private ImageView avatar;  
    private TextView name;  
    private TextView age;  
    private TextView sex;  

    public FriendHolder(View itemView) {  
        super(itemView);  
        avatar = (ImageView) itemView.findViewById(R.id.friendsubavatar);  
        name = (TextView) itemView.findViewById(R.id.friendsubname);  
        age = (TextView) itemView.findViewById(R.id.friendsubage);  
        sex = (TextView) itemView.findViewById(R.id.friendsubsex);  
    }  
}

SecondaryAdapter的使用方法也十分簡單,和普通的Adapter的區別是需要分別編寫兩個ViewHolder和分別創建布局即可,使用方法也和普通的Adapter一致。其中需要注意的是設置數據的方法。

List<FriendGroupBean> data;  
List<List<UserBean>> userList = new ArrayList<>();  
adapter.setData(data,userList);

其中setData()的第一個參數是List\ ,第二個參數是List\ >,第二個參數是一個二維列表,這點需要大家注意。更詳細的使用方法讀者可以查看源碼注釋哦。

SimpleDecoration 使用

SimpleDecoration提供了多個工廠方法,分別是:

  1. newTransparentDivider(Context context),創建默認透明分割線,默認寬度為16dp
  2. newTransparentDivider(Context context, int interva),創建指定寬度的透明分割線
  3. newLinesDivider(Context context),創建普通的分割線,默認寬度為1dp
  4. newLinesDivider(Context context, int interval),創建指定寬度的普通分割線
  5. newDrawableDivider(Context context, int interval , @DrawableRes int drawableId),創建指定圖片和指定寬度的分割線。
  6. newDrawableDivider(Context context, int interval, Drawable drawable)同上

通過工廠方法創建出需要的分割線對象后,調用RecyclerView的addItemDecoration()添加到RecyclerView中即可。

小結

這就是目前的RecyclerViewUtil工具類中提供的主要功能,功能雖然不多,但是這些都是我們在日常開發中經常遇到的問題。在后續維護中,筆者會進一步提供封裝好的RecyclerView相關的Fragment,Activity等。我也希望讀者在使用的過程中有什么有趣的想法和建議的話,可以聯系本人進行開發,筆者會斟酌開發的。當然,通過github發起pull requests共同完善這個項目也是極好的。

 

來自:http://www.tangpj.com/2017/02/17/recyclerviewutils/

 

 本文由用戶 XavSalting 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!