RecyclerView的使用和封装

整体上看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

http://www.jianshu.com/p/727c18f4bf20
也是说封装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值