简介
truck项目的github地址:
https://github.com/hookYuan/Truck
Adapter是Android开发中绕不开的一个话题,因为在Android中如果要实现大量数据的列表,离不开Listview,GridView,RecyclerView。而我这里做的主要就是针对特定的需求对不同的列表的Adapter做一定的封装,最后在谈一谈我再开发中遇到的复杂列表都是如果处理的,提供一个快速的实现方案。
示例
在我刚开始接触Android的时候,大家普遍使用的是ListView,GridView。然而当我渐渐走进Android的时候,发现大家也渐渐从ListView、GridView走向了RecyclerView。在我看来,如果是简单布局,用recyclerViewh和ListView是没有什么本质区别的,但是如果需要处理复杂的列表布局时,ListView的回收机制就显得有点不够聪明,所以往往复杂的情况下,我都是推荐使用RecyclerView。首先谈谈BaseListAdapter。具体使用如下:
listView.setAdapter(new BaseListAdapter<String>(getData(), R.layout.text_item_layout) {
SparseBooleanArray collapsedStatus = new SparseBooleanArray();
@Override
public void bindView(ViewHolder holder, String obj) {
CollapsedTextView textView = holder.getView(R.id.ctv_content);
textView.setTextList(obj, collapsedStatus, holder.getItemPosition());
}
});
泛型String表示List中数据类型,通过构造方法传入数据源,item布局。在bindView方法中实现对数据与View的绑定。封装了一些简单的方式来实现绑定,例如holder.setText()等。
接下来谈谈RLVAdapter,具体实现如下:
public class SelectContactsAdapter extends RLVAdapter {
private List<PSelectContacts.User> listUser;
public SelectContactsAdapter(Context context, List<PSelectContacts.User> listUser) {
super(context);
this.listUser = listUser;
}
@Override
public int getItemViewType(int position) {
return 1;
}
@Override
public int getItemLayout(ViewGroup parent, int viewType) {
if (viewType == 0) {
return R.layout.act_three_select_contacts_head;
} else
return R.layout.act_three_select_contacts_item;
}
@Override
public void onBindHolder(ViewHolder holder, int position) {
int pos = position;
holder.setText(R.id.tv_contact_name, listUser.get(pos).getName());
ImageView ivAvatar = holder.getView(R.id.iv_contacts_avatar);
GlideHelper.loadCircle(listUser.get(pos).getAvatar(), ivAvatar);
}
@Override
public void onItemClick(ViewHolder holder, View view, int position) {
}
@Override
public int getItemCount() {
return listUser.size();
}
}
RLVAdapter主要对ViewHolder进行封装,在Adapter中添加item默认点击事件。基本用法同BaseListAdapter。
ExpandAdapter,这个是我经常在需求见到需要做可折叠的列表,然而系统默认的折叠列表总觉得定制性不高,且没有任何动画效果。ExpandAdapter默认添加RecyclerView插入动画、删除动画。ExpandAdaper使用只需继承ExpandAdapter,复写相关方法即可。
GridDivider,RecyclerView的分割线。recyclerView可以通过设置GridDivider实现分割线效果,GridDivider分割线支持自定义分割线颜色、自定义分割线高度、自定义分割线背景图片。具体使用方法如下:
rlvWhiteMe.addItemDecoration(new GridDivider((int) Kits.Dimens.dpToPx(mContext, 10f)
, ContextCompat.getColor(mContext, R.color.background_rlv)));
快速实现
介绍完了以上3中Adapter和GridDivider,是不是觉得开发有种事半功倍的效果。接下在推荐一种truck中列表的专用模板MVPListActivity。具体使用方法,请参考
Android开发truck快速开发框架MVP实现(二)
。MVPListActivity模板,一键生成Adapter,Activity,Presenter。当出现列表界面时,让你只专注于item界面的搭建、专注于逻辑判断、减少重复性代码。当然对于一般的列表界面这样已经完全足够了,但是如果你遇到的是类似淘宝首页,甚至比他还要复杂的时候,我推荐使用vlayout来实现,vlayout在我看来就是一个功能特别全面的自定义Adapter,毕竟alibaba都用它来实现复杂界面,我们有什么及理由拒绝呢。我用vlayout搭建过几个复杂界面,初次使用确实有一点坑,建议就是,多多看看github上的常见问题。
最后附上truck快速开发交流qq群:698442320