整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
- 你想要控制其显示的方式,请通过布局管理器LayoutManager
- 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
- 你想要控制Item增删的动画,请通过ItemAnimator
- 你想要控制点击、长按事件,请自己写
基本使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/id_recyclerview"
android:divider="#ffff0000"
android:dividerHeight="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
HomeActivity.this).inflate(R.layout.item_home, parent,
false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
{
holder.tv.setText(mDatas.get(position));
}
@Override
public int getItemCount()
{
return mDatas.size();
}
class MyViewHolder extends ViewHolder
{
TextView tv;
public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
}
我们可以通过该方法添加分割线:
mRecyclerView.addItemDecoration()
LayoutManager
LinearLayoutManager 现行管理器,支持横向、纵向。
GridLayoutManager 网格布局管理器
StaggeredGridLayoutManager 瀑布就式布局管理器mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
StaggeredGridLayoutManager.HORIZONTAL));
// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是
notifyItemInserted(position)与notifyItemRemoved(position) ,否则没有动画效果
public void addData(int position) {
mDatas.add(position, "Insert One");
notifyItemInserted(position);
}
public void removeData(int position) {
mDatas.remove(position);
notifyItemRemoved(position);
}
转自:
http://blog.csdn.net/lmj623565791/article/details/45059587
封装
具体的封装过程:
1-SingleAdapter:将Adapter从具体到泛型
思路:
1. 构造时传入layoutId
2. 数据类型泛化
3. 提取出万能的SuperViewHolder
4. bindData的方法抽象化,延迟实现(交由具体的子类实现)
万能ViewHolder
2-MultiAdapter:从单布局到多布局
思路:
1. 构造时传入layoutId数组
2. 添加layoutMap,记录layoutId–viewType的对应关系
3. bindLayout的方法抽象化,由子类实现Item–layoutId的对应关系
用map存放viewType和layoutId的对应关系
用map.entrySet来根据value读取key
3-SuperAdapter:多布局中,从单实体到多实体
思路:
1. 将泛型T升级为包装类LayoutWrapper,持有布局id,泛型数据Item,控制器holder
2. 提取出接口DataHolder,用于实现ViewHolder和ItemData的绑定
1、定义了布局包装类
2、定义了控制器接口
3、由控制器接口的bind来负责绑定
4-LayoutWrapper:多布局中,配置某项可占据多列
思路:
1. LayoutWrapper添加spanSize属性,记录该item的列数
2.使用时调用gridLayoutManager.setSpanSizeLookup来动态设置列数
![]()
1、如果你的代码中,存在着大段相同或极其相似的代码,那么,开始重构吧!
2、在不断的重构中,你会发现:实现很重要,如何组织这些实现也同样重要!
3、重构两个着力点:数据泛型化、方法抽象化
转自http://blog.csdn.net/fisher0113/article/details/51955845