Android中RecyclerView的基本用法

关于RecyclerView,在很早以前就看到过,不过今天才对RecyclerView进行了了解,

这个控件是属于V7包下的,可以添加依赖

compile 'com.android.support:recyclerview-v7:23.1.0'

RecyclerView可以说是ListView的一种优化,强制使用ViewHolder,同时可以通过setLayoutManager进行不同布局的选择,总共有三种布局:

1.LinearLayoutManager 线性布局,LayoutManager的实现类,类型包括Vertical和Horizontal,

          可以看到线性布局有三种构造函数

参数含义:当前上下文,将用于访问资源。

参数含义:context 上下文对象,orientation 布局里的数据展示的方向,有两种方式

               LinearLayoutManager.HORIZONTAL,LinearLayoutManager.VERTICAL

 如果设置为true,从最终的布局开始。

2.GridLayoutManager格子布局,继承自LinearLayoutManager,

实现效果类似GridView

3.StaggeredGridLayoutManager交错的格子布局,同样也是LayoutManager的实现

类,类型包括VerticalHorizontal与GridLayoutManager很相似,

不过是交错的格子,也就是宽高不等的格子视图,类似瀑布流的效果

下面详细介绍RecyclerView的使用:

1.在布局中添加控件:

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

2.在类中进行初始化:

    private RecyclerView recyclerView;
    //存放数据
    private List<String> list;
    //布局管理器
    private android.support.v7.widget.RecyclerView.LayoutManager layoutManager;
    //RecyclerView的Adapter
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        //添加数据
        list = new ArrayList<String>();
        initData();
        //设置RecyclerView的显示布局
        recyclerView.setLayoutManager(layoutManager);
        //这里添加动画,有一个默认的动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //可以添加item的下划线,也就是可以自动以,继承ItemDecoration
//        recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
//        });
        myAdapter = new MyAdapter(list,this);
        recyclerView.setAdapter(myAdapter);
        //自己添加点击回调
        myAdapter.setOnItemClick(new MyAdapter.OnItemClick() {
            @Override
            public void click(View item, int position) {
                Toast.makeText(MainActivity.this,position + "",Toast.LENGTH_LONG).show();
            }
        });
    }
代码中有注释,这里就不过多解释,在其中Adapter需要我们通过继承RecyclerView.Adapte

进行编写。如果想自己定义ItemDecoration,可以继承ItemDecoration进行定义。

3.MyAdapter的编写:

编写类继承RecyclerView.adapter,并实现里面的三个方法:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout,null);
    return new MyHolder(view,onItemClick);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    MyHolder hodler1 = (MyHolder) holder;
    hodler1.textView.setText(list.get(position));


}

@Override
public int getItemCount() {
    return list.size();
}

第一个函数返回ViewHolder,第二个函数ViewHolder和数据源的绑定,第三个函数

得到集合的个数。

实现ViewHoler类:

class MyHolder extends  RecyclerView.ViewHolder implements View.OnClickListener {
        TextView textView;
        private OnItemClick onItemClick;
        public MyHolder(View itemView, OnItemClick onItemClick) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
//            itemView.setOnClickListener(this);
//            itemView.setOnLongClickListener(this);
            //点击回调
            this.onItemClick = onItemClick;
            itemView.setOnClickListener(this);
        }
        //点击进行回调
        @Override
        public void onClick(View v) {
            if(onItemClick != null){
                onItemClick.click(itemView,getAdapterPosition());
            }
        }
    }
在ViewHolder中进行控件的绑定,

如果不考虑点击事件,一个RecyclerView的简单实用就实现了,但往往我们都有点击事件的处理,而RecyclerView本身并没有clickListener的监听,这就需要我们自己写回调进行处理,因为ViewHolder可以拿到每个Item的根布局,所以可以再ViewHolderzhogn中做文章

点击事件的处理:

1.进行接口的编写:

	interface OnItemClick{
 	   void click(View item,int position);
	}

	private OnItemClick onItemClick;
	
	public void setOnItemClick(OnItemClick onItemClick) {
	    this.onItemClick = onItemClick;
	}
在实现onCreateViewHolder方法时,创建ViewHolder对OnItemClick对象进行传递

2.在ViewHolder中对点击事件进行处理

   class MyHolder extends  RecyclerView.ViewHolder implements View.OnClickListener {
        TextView textView;
        private OnItemClick onItemClick;
        public MyHolder(View itemView, OnItemClick onItemClick) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
//            itemView.setOnClickListener(this);
//            itemView.setOnLongClickListener(this);
            //点击回调
            this.onItemClick = onItemClick;
            itemView.setOnClickListener(this);
        }
        //点击进行回调
        @Override
        public void onClick(View v) {
            if(onItemClick != null){
                onItemClick.click(itemView,getAdapterPosition());
            }
        }
    }
在构造函数中进行OnItemClick的赋值,同时设置每个条目的点击事件,在ItemView的点击事件中进行OnItemClick的判断,同时实现点击。



关于点击事件的了解可看点击打开链接




发布了38 篇原创文章 · 获赞 28 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章