RecyclerView的使用(1)

Recycler介绍:RecyclerView是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView.

RecylerView和ListView的目的性其实都是去维护少量的View来展示大量的数据集,而RecyclerView的优点在于提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

  • 如果你想要控制它的显示方式,就可以使用LayoutManager
  • 如果你想要自定义item分割线,可以使用ItemDecoration
  • 如果你想要item的增删动画,可以使用ItemAnimator

但是对于RecylerView来说,它并不像ListView一样直接给你提供了OnItemClickListener、OnItemClickLongListener这样的点击事件,以至于你想实现点击事件需要通过你自己来实现这些.下面我们就来谈一谈关于RecyclerView的基本使用吧.

添加依赖

dependencies {
    compile 'com.android.support:recyclerview-v7:24.0.0'
    .........   
}

在XML布局中

        <android.support.v7.widget.RecyclerView
            android:id="@+id/mList"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

没有什么特别的地方、和ListView一样

需要一个RecyclerView适配器

public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.Demo>{

    private String[] data;
    private Context mContext;

    public DemoAdapter(String[] datas, Context context){
        this.data = datas;
        mContext = context;
    }

    @Override
    public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
        return new Demo(rootView);
    }

    @Override
    public void onBindViewHolder(Demo holder, int position) {
        holder.imageView.setImageResource(R.drawable.back_default);
        holder.textView.setText(data[position]);
    }

    @Override
    public int getItemCount() {
        return data.length;
    }

    class Demo extends RecyclerView.ViewHolder {
        private ImageView imageView;
        private TextView textView;
        public Demo(View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.iv_1);
            textView = itemView.findViewById(R.id.tv_1);
        }
    }
}

比较简单的一个使用,在OnCreateViewHolder中创建视图,在onBindViewHolder中绑定视图数据,RecyclerView是自动复用视图的,所以不需要像listView中使用代码去做,当然你也可以手动来设置不复用,获取OnCreateViewHolder中创建出来的holder,holder.setIsRecyclable(false);

LayoutManager

其实SDK中自带了三种LayoutManager

  • LinearLayoutManager
  • GridLayoutManager
  • StaggeredGridLayoutManager
    分别是
  • 线性布局:可以设置横向和纵向
  • 网格布局:可以在设置多少行列、以及横向纵向
  • 瀑布流布局

使用

以上这些必要的工作已经做好了吗,下面我们就来试一下RecyclerView的简单使用吧

RecyclerView mRecyclerView = findViewById(R.id.mListView)
mRecyclerView.setLayoutManager(new LinearLayoutManager(this))
mRecyclerView.setAdapter(new DemoAdapter(data,this))

这样就出现一个简单的RecyclerView列表

关于RecyclerView的点击事件

RecyclerView是没有像ListView那样很直白的点击事件的,这就需要我们自己来进行处理了,
我们可以在

@Override
    public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
        return new Demo(rootView);
    }

这部分代码中、对rootView进行点击事件
rootView.setOnClickListener(new OnClickListener(){
………
})
那么我们怎么来传递当前的点到这个位置的值呢、我们并没有看到position这个参数
其实是可以的,看看怎么做

@Override
    public Demo onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootView = LayoutInflater.from(mContext).inflate(R.layout.demo,parent);
        Demo demo = new Demo(rootView);
        int position = demo.getAdapterPosition()
        return demo 
    }

这样就获取到了position,我们也可以在内部创建一个自己的监听接口、将点击的这个事件传递到外面,这样就可以做到和listView一样的写法,我就姑且不在这里做了。

结尾

剩下的还有一些自己来定义动画、自己定义layoutManger、分割线、以及使用中遇到的一些坑,我们下次再说

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章