这期文章,推荐一个类库 ItemPool,它能很大程度上减小你的 Adapter 数量,它是一个解耦实现,能把 ViewHolder/ItemView 解耦出来。请记住,这让全部 ItemView 变得可复用html
自从 Android 的 RecyclerView 组件发布以来,RecyclerView 成为了 Android 开发中实现容器视图的首选。要实现一个 RecyclerView,必须为其提供一个 RecyclerView.Adapter。咱们来看看一个普通 Adapter 的写法:git
做者:nekocodepublic class CommonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final List<String> list; public CommonAdapter(List<String> sampleData) { this.list = sampleData; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View item = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false); return new ViewHolder(item); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolder) { ((ViewHolder) holder).bindData(list.get(position)); } } @Override public int getItemCount() { return list.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { private TextView text; public ViewHolder(View itemView) { super(itemView); text = (TextView) itemView.findViewById(R.id.textView); } public void bindData(String data) { text.setText(data); } } }
这暂且来讲尚未什么大碍。可是当你要实现另一个相似的 Adapter 时,假设里面有一些在旧 Adapter 中已经出现过的 ItemView,你会发现你没有办法复用以前写过的代码,你只能从新定义一个 Adapter 类并复制旧的 ViewHolder 代码到新的 Adapter 上。这执行起来十分机械,而且当某个 ItemView 发生更改时,你须要同步更改全部对应 Adapter 中的 ViewHolder。github
咱们须要作点工做把 ViewHolder 代码从 Adapter 中抽离并独立出来,而 ItemPool 能帮你完成这点工做。ide
使用 ItemPool 后,咱们把写 ViewHolder 改变成了写 Item。不一样的 Item 用来将不一样类型的 Data 映射到相应的 ItemView 上。更重要的是,这些 Item 是可复用的,这意味着你在另一个 RecyclerView 中也能直接使用该 Item。一个经典的 Item 以下:函数
public class TestItem extends Item<String> { TextView textView; @NonNull @Override public View onCreateItemView(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) { View itemView = inflater.inflate(R.layout.item_test, parent, false); textView = (TextView) itemView.findViewById(R.id.textView); return itemView; } @Override public void onBindItem(@NonNull final RecyclerView.ViewHolder holder, @NonNull String s, ItemEventHandler eventHandler) { textView.setText(s); } }
上面除去 IDE 自动生成的代码,实际上仅仅须要本身写 5 行代码。这个 Item 经过 onCreateItemView() 函数来生成某个 ItemView,并挂钩了 String 这个数据类型,而后经过 onBindItem() 函数来将 String 类型的数据传递给 ItemView 进行视图更新。this
好的,接下来咱们能够给某个 RecyclerView 组装 Item 了,它看起来是这样的:spa
ItemPool items = new ItemPool(); items.addType(TestItem.class); items.addType(TestItem2.class); items.add(new Header()); items.add("A"); items.add("B"); items.attachTo(recyclerView);
能够看出来咱们并不要再写 Adapter 了,甚至也不用额外定义一个 DataList 了,它经过如下的工做流程来生成对应的 ItemView:3d
简而言之就是将指定类型的数据用指定类型的 Item 来展现。这十分容易理解,你只要记住哪一个 Item 对应哪一个数据类型,并往 ItemPool 中塞数据就好了code
完整商城源码下载地址: http://www.tp-shop.cn/download.htmlhtm