你需要的一個RecyclerView工具類
目前這個庫能支持的功能有:封裝好的Adapter、支持二級列表功能的Adapter、完善的分割線類(你確定你不是來釣魚的?)。項目地址是: https://github.com/DobbyTang/RecyclerUtil
SimpleAdapter
SimpleAdapter的作用是快速實現Adapter的開發,其中支持的功能是
- 快速添加頂部和底部,并且可以根據需要監聽底部和頂部的事件
- 維護列表數據
- 實現點擊事件
- 簡化開發的步驟
其中SimpleAdapter的頂部和底部是依賴于RecyclerView的生命周期的,避免了內存溢出和在Fragment中的部分場景使用會導致崩潰的問題。
SecondaryAdapter
SecondaryAdapter的作用是實現一個支持二級列表功能的Adapter。可以用于一些特殊的場景中(購物車,二級分類列表等)。
SimpleDecoration
的是分割線類,它的作用的快速添加分割線并且支持多種效果。
- 線段分割線
- 透明分割線
- 自定義圖片分割線
- 自定義分割線的寬度
筆者在參考一些網上的分割線代碼的時候,發現當分割線的寬度過大的時候會出現一個問題:在使用表格類型的布局的時候,由于分割線會占用一定的空間,會影響第一個或最后一個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提供了多個工廠方法,分別是:
- newTransparentDivider(Context context),創建默認透明分割線,默認寬度為16dp
- newTransparentDivider(Context context, int interva),創建指定寬度的透明分割線
- newLinesDivider(Context context),創建普通的分割線,默認寬度為1dp
- newLinesDivider(Context context, int interval),創建指定寬度的普通分割線
- newDrawableDivider(Context context, int interval , @DrawableRes int drawableId),創建指定圖片和指定寬度的分割線。
- 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/