太落后了,用了两年的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