RecyclerView的BaseAdapter的用法與條目監聽的書寫
阿新 • • 發佈:2019-01-01
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);的方式獲取到條目的下標值。這樣就可以區分不同條目的點選事件。