ListItem是简化列表(ListView、RecyclerView)使用的组件。有了ListItem:
- 不再需要编写一个呆板的无趣的Adapter。
- 把精力专注于编写一个个高内聚、低耦合的Item。
- 你可以像搭积木一样,在不同页面将这些Item组合起来。
- ListItem源于Adapter的"呆板"。在传统的方式中,无论ListView 还是 RecyclerView都需要一个Adapter,而每个Adapter 大多大同小异,编写Adapter的过程也是个"机械"、"繁复"、"低技术含量"、"低成就感"的过程。
- Adapter 往往成为整个列表页面的逻辑节点,各种业务代码在这里交汇、纠缠。在一定程度上,Adapter成为整个页面的耦合点。 在页面需要变动时,我们往往需要在Adapter的多处进行修改。
- ListItem提供了一个通用的Adapter:ItemAdapter。
- ListItem提供了页面元素的统一实现方案:RecyclerDataItem。任何页面元素继承自RecyclerDataItem,成为一个Item。RecyclerDataItem将一个页面元素的布局、viewholder、数据聚合在一起。
- ItemAdapter.addItem(new RecyclerDataItem())
####我们以一个部门分组的人员列表为例:
- 使用ItemAdapter
recyclerView = (RecyclerView) layoutView.findViewById(R.id.combolist);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
adapter = new ItemAdapter(getContent());
recyclerView.setLayoutManager(llm);
recyclerView.setAdapter(adapter);
- 构建Item
/**
* 展示一个文案的简单item,通过范性指定item的ViewHolder和数据(String)
*/
public class TitleItem extends RecyclerExtDataItem<TitleItem.ViewHolder, String> {
public TitleItem(String data) {
super(data, null);
}
/**
* onBindViewHolder 里实现ViewHolder和数据(String)的绑定过程,也是传统RecyclerView
* 的复用过程
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder) {
viewHolder.title.setText(data);
}
/**
* 指定布局文件,也可以通过View getLayoutView(ViewGroup parent)指定视觉布局。
*/
@Override
public int getLayoutId() {
return R.layout.title_item;
}
/**
* 当前item的ViewHolder。推荐写成类似这样的内部类。代码内聚度更高。
*/
public static class ViewHolder extends CustomRecyclerViewHolder {
TextView title;
public ViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
}
}
}
public class PeopleItem extends RecyclerExtDataItem<TitleItem.ViewHolder, People> {
public TitleItem(People data) {
super(data, null);
}
/**
* onBindViewHolder 里实现ViewHolder和数据(String)的绑定过程,也是传统RecyclerView
* 的复用过程
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder) {
viewHolder.name.setText(data.name);
viewHolder.age.setText(data.age);
viewHolder.address.setText(data.address);
}
@Override
public int getLayoutId() {
return R.layout.people_item;
}
/**
* 当前item的ViewHolder。推荐写成类似这样的内部类。代码内聚度更高。
*/
public static class ViewHolder extends CustomRecyclerViewHolder {
TextView name;
TextView age;
TextView address;
public ViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.name);
age = (TextView) itemView.findViewById(R.id.age);
address = (TextView) itemView.findViewById(R.id.address);
}
}
}
- 添加Item
//添加部门1的人员
List<People> depart1 = ....
adapter.addItem(new TitleItem("部门1"),true);
for(People people : depart1){
adapter.addItem(new PeopleItem(people),true);
}
//添加部门2的人员
List<People> depart2 = ....
adapter.addItem(new TitleItem("部门2"),true);
for(People people : depart2){
adapter.addItem(new PeopleItem(people),true);
}