首页 > 代码库 > RecyclerView

RecyclerView

        RecyclerView是Google于5.0后新推出的控件,用于替代ListView,在ListView中convertView是复用的,而在RecyclerView中,是缓存的ViewHolder对象,所以在RecyclerView中有一个onCreateViewHolder方法,将itemView传递给每个创建的ViewHolder,在ViewHolder中获取itemView上的每个View并作为其成员。通过onBindViewHolder中viewHolder得到要操作的view。

 

通过recyclerView.setLayoutManager()来设置要显示的列表类型,现在有三种:

1. LinearbyLayoutManager

2. GridLayoutManager

3. StaggeredGridLayoutManager  瀑布流

 

recyclerView.setHasFixedSize(true); 设置每个Item高度一致,可提高性能

 

recyclerView的Adapter需继承RecyclerView.Adapter,实现 onCreateViewHolder、onBindViewHolder和getItemCount方法。

并创建ViewHolder 继承 RecyclerView.ViewHolder,将其作为泛型类型传递给RecyclerView.Adapter的<>中。

 

onCreateViewHolder 获取ItemView,创建ViewHolder时作为参数传递出去。

技术分享
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);        view.setOnClickListener(this);        return new ViewHolder(view);    }
View Code

 

ViewHolder得到itemView后,获取其子控件,作为成员属性。外部通过viewHolder得到itemView下所有控件再做操作。

技术分享
public static class ViewHolder extends RecyclerView.ViewHolder{        private TextView mTextView;        public ViewHolder(View v){            super(v);            mTextView = (TextView)v.findViewById(R.id.item_tv);            if (flag){                mTextView.setHeight(200);            }else{                mTextView.setHeight(280);            }            flag=!flag;        }        public TextView getmTextView() {            return mTextView;        }    }
View Code

 

onBindViewHolder 获取到viewHolder,对其内部view填充数据等操作。

技术分享
public void onBindViewHolder(ViewHolder holder, int position) {        holder.getmTextView().setText(dataset.get(position));        holder.getmTextView().setTag(dataset.get(position));    }
View Code

 

关于RecyclerView的点击事件处理:

自定义一个点击事件处理的接口,定义其实现的方法传递两个参数(view, data)。向外部暴露一个set方法用于传递这个接口的实现,在viewHolder或者onCreateViewHolder将设置itemView的onClick事件,将事件的处理交给从外部传递过来的自定义的点击事件。

 

添加数据:adapter.notifyItemInsered();

删除数据:adapter.notifyItemRemove();

 

RecyclerView