Android api22之后,Google推出了很多新控件,其中recyclerview作为listview的替代控件而受到很多开发者的青睐。其最主要的原因就是RecyclerView应用起来更为方便,也更加的灵活。
关于RecyclerView的使用,网上有很多相关的帖子,介绍的也很详细。在这里我就不在一一赘述了。这篇帖子,主要讲的是RecyclerView的BaseAdapter的使用,以及RecyclerView的条目监听事件的设置。
相比较于ListView,RecyclerView无论从条目排列方式,还是从布局管理上都要优秀很多。但是不知道为什么,Google没有为RecyclerView设置提条目监听事件。所以,就需要开发者们自己去添加条目监听。这种情况下,就用到的BaseAdapter。
public class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseRecyclerViewAdapter.BaseViewHolder> { protected LayoutInflater layoutInflater = null ; private Context context ; //创建接口对象 private ICallBack onItemListener ; public BaseRecyclerViewAdapter(Context context, ICallBack callBack) { this.context = context; this.layoutInflater = LayoutInflater.from(context); } public BaseRecyclerViewAdapter(Context context) { this.context = context; this.layoutInflater = LayoutInflater.from(context); } /** * 初始化接口对象 */ public void setOnItemClickListener(ICallBack listener) { this.onItemListener = listener; } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { } @Override public int getItemCount() { return 0; } protected class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ private int position ; public BaseViewHolder(View itemView ,Context context ) { super(itemView); if (context instanceof ICallBack){ onItemListener = (ICallBack) context; } itemView.setOnClickListener(this); } public void setPosition(int position) { this.position = position; } @Override public void onClick(View v) { if (onItemListener != null ){ onItemListener.OnItemClickListener(v, v.getTag() , position); } } } /*** * 定义ICallBack接口,实现条目点击监听 */ public interface ICallBack{ void OnItemClickListener(View v, Object o , int position); } }
在上述代码中,BaseAdapter类初始化了LayoutInflater;并且绑定了BaseViewHolder,而在BaseViewHolder中,通过
itemView.setOnClickListener(this);
绑定了每个itemView的点击监听事件,当然,如果想要添加长按事件的话,只需要添加
itemView.setOnLongClickListener(this);并实现该接口中的方法就可以了。
其中在BaseViewHolder中,添加了
public void setPosition(int position) { this.position = position; }
这个方法的作用在于,在BaseAdapter的子类中可以再onBindViewHolder(BaseViewHolderholder,int position)中通过holder.setPosition(position);的方式获取到条目的下标值。这样就可以区分不同条目的点击事件。