android RecyclerView的简单使用

太落后了,用了两年的listview,也该换换口味了。android 5.0以后google提供了一个新的控件RecyclerView。其高度的灵活性和复用性得到了码农们的一致好评...ListView等控件直接就活在了他的阴影之下...由于他的高度灵活性,使用上也较listview稍微复杂点,像简单的点击事件、分割线等等也是需要我们自定义设置的。好,下面我们看下他的简单使用。

一、环境配置

首先说下环境的问题,由于RecyclerView是5.0以后的控件,所以需要V7包的支持。在android studio下直接在build文件里的dependencies里加入依赖,如下:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:recyclerview-v7:24.+'
}

二、RecyclerView的使用

1、在布局文件里引入RecyclerView控件。如下:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_main"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="60dp"
    android:background="#bbccaa"
    ></android.support.v7.widget.RecyclerView>

2、在代码里对RecyclerView进行初始化

recyclerView = (RecyclerView)findViewById(R.id.recycler_main);
        recyclerAdapter = new RecyclerAdapter(list,context);
        /**
         * 设置item的点击事件
         */
        recyclerAdapter.setOnItemClickListener(new OnRecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                showToastShort(list.get(position).getContent());
            }

            @Override
            public void onLongClick(View view, int position) {
                showToastShort("删除了" + list.get(position).getContent());
                // 长点击删除
                recyclerAdapter.notifyItemRemoved(position);
                Log.e(TAG, "删除后的长度=" + recyclerAdapter.getItemCount());
            }
        });
        recyclerView.setAdapter(recyclerAdapter);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        /**
         * 设置布局管理器,必须设置,否则数据不显示
         */
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
//        recyclerView.setLayoutManager(new GridLayoutManager(this,4));
//        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));

其中点击事件为自定义的接口类OnRecyclerViewClickListener并在RecyclerAdapter里实现的,在接口类文件里简单定义了两个方法分别是:onClick和onLongClick,一个点击事件,一个长点击事件,想要扩展别的功能也都可在这个类里增加实现。其中recyclerView有一个属性必须要设置,就是setLayoutManager,即设置他的布局,如果不设置会导致页面上什么也不显示。不过这也是他灵活性的一个展现,通过设置布局管理器可将RecyclerView设置为普通的listview列表的样式,也可以设置为网格样式或者瀑布流的样式等等。只需一行代码即可实现样式的更改,效果如下:

                   

三、实现RecyclerView的adapter。

RecyclerView的adapter继承的就不是BaseAdapter了,而是RecyclerView.Adapter。继承此类必须要实现三个方法:onCreateViewHolder、onBindViewHolder和getItemCount。每一个item都将通过onCreateViewHolder和onBindViewHolder实现页面的生产和数据的传入绑定。先通过onCreateViewHolder创建item,如下:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.item_recycler,parent,false);
    Log.e(TAG, "onCreateViewHolder: 创建一个item");
    return new MyViewHolder(view);
}

然后通过RecyclerView.ViewHolder进行数据的绑定,绑定后RecyclerView会对ViewHolder数据进行缓存,上面长点击方法我对item数据进行了删除,并且没有主动刷新adapter,然后输出了下源数组list的长度,发现长度并没与变,而item在页面上已被删掉。绑定如下:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    Log.e(TAG, "onBindViewHolder: 绑定item数据");
    Data data = list.get(position);
    MyViewHolder myViewHolder = (MyViewHolder)holder;
    myViewHolder.position = position;
    myViewHolder.tv1.setText(data.getName());
    myViewHolder.tv2.setText(data.getContent());
    if (mClickListener != null) {
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mClickListener.onClick(view,position);
            }
        });
        myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                mClickListener.onLongClick(view,position);
                return true;
            }
        });
    }
}

每一个item的生命周期里创建只会发生一次,而绑定数据则是在出现在页面的时候进行的,比如下拉到某个位置后再往回拉,已经创建过了的item是不会再重新创建的,而是走onBindViewHolder里的流程。从上面的代码也可以看出,里面有个对象是RecyclerView.ViewHolder。其作用的跟listview的ViewHolder大致相同,主要是为了管理item的页面控件和存储数据,下面一点详细讲RecyclerView.ViewHolder。

四、RecyclerView.ViewHolder

用过ListView的都知道,他的viewholder只是一个自定义的实体类。而RecyclerView的ViewHolder则必须要继承RecyclerView.ViewHolder。其初始化的时候要传入item布局的根对象,用来获取它的各个子对象控件,实现数据的绑定,并且item的点击事件、滑动事件等等都是通过ViewHoler的itemView进行绑定实现的。下面是RecyclerView.ViewHolder在本例的一个简单的自定义实现:

class MyViewHolder extends RecyclerView.ViewHolder{
    public TextView tv1;
    public TextView tv2;
    public int position;

    public MyViewHolder(View itemView) {
        super(itemView);
        tv1 = (TextView)itemView.findViewById(R.id.textView);
        tv2 = (TextView)itemView.findViewById(R.id.textView2);
    }
}


下面是demo的下载链接https://github.com/cnliwy/RecyclerViewDemo


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值