1. 程式人生 > >Android RecyclerView (三)初學,為RecyclerView新增Item點選監聽。

Android RecyclerView (三)初學,為RecyclerView新增Item點選監聽。

前兩篇文章講述瞭如何基本的使用RecyclerView呈現出自己想要的效果,但是我好奇的是,為什麼RecyclerView沒有.SetOnClick之類的方法呢,RecyclerView不得不承認,它是一款很強大的軟體,僅僅幾行程式碼就可以切換出自己想要的佈局,但是它並沒有屬於自己的CilckListener,這裡就需要我自己去新增程式碼實現點選監聽的功能了。

當然我們需要在介面卡中去新增程式碼實現這個功能。我現在在第一篇文章的程式碼中新增就可以了。
MyAdapter

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private
Context mContext; private List<String> infos ; private LayoutInflater inflater; public interface OnItemOnClickListener{ void onItemOnClick(View view,int pos); void onItemLongOnClick(View view ,int pos); } private OnItemOnClickListener mOnItemOnClickListener; public
void setOnItemClickListener(OnItemOnClickListener listener){ this.mOnItemOnClickListener = listener; } public MyAdapter(Context mContext,List<String> infos){ this.mContext = mContext; this.infos = infos; } public RecyclerView.ViewHolder onCreateViewHolder
(ViewGroup parent, int viewType) { View view = LayoutInflater.from(this.mContext).inflate(R.layout.activity_item,parent,false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { ViewHolder viewHolder = (ViewHolder) holder; viewHolder.getTextView().setText(infos.get(position)); if(mOnItemOnClickListener!=null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mOnItemOnClickListener.onItemOnClick(holder.itemView,position); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { mOnItemOnClickListener.onItemLongOnClick(holder.itemView,position); return false; } }); } } class ViewHolder extends RecyclerView.ViewHolder{ private TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView); } public TextView getTextView(){ return textView; } } @Override public int getItemCount() { return infos.size(); } }

這裡可以看到,我們先添加了一個介面

 public interface OnItemOnClickListener{
        void onItemOnClick(View view,int pos);
        void onItemLongOnClick(View view ,int pos);
    }

這個接口裡面我們寫了兩個函式名稱,一個是點選 監聽,一個是長按監聽。
然後我們又在MyAdapter類中寫了一個設定監聽的方法和聲明瞭一個這個介面的內部變數。

  private OnItemOnClickListener mOnItemOnClickListener;
  public void setOnItemClickListener(OnItemOnClickListener listener){
        this.mOnItemOnClickListener = listener;
    }

然後這個setOnItemClickListener就是供外部來設定監聽的,在這裡面我們隊我們內部成員OnItemOnClickListener進行了傳參賦值。

然後我們在ViewBinder裡進行繫結。

if(mOnItemOnClickListener!=null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mOnItemOnClickListener.onItemOnClick(holder.itemView,position);
                }
            });

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    mOnItemOnClickListener.onItemLongOnClick(holder.itemView,position);
                    return false;
                }
            });

這裡面我們先判斷內部成員是否初始化,如果不為空就進行下面的操作。
相當於我們給每個點選的ItemView分別新增監聽然後達到我們給RecyclerView新增監聽器的目的。

然後MainActivity中新增的程式碼如下:

  myAdapter.setOnItemClickListener(new MyAdapter.OnItemOnClickListener() {
            @Override
            public void onItemOnClick(View view, int pos) {
                Toast.makeText(MainActivity.this, "This is"+pos, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongOnClick(View view, int pos) {
                Toast.makeText(MainActivity.this, "LongClick"+pos, Toast.LENGTH_SHORT).show();
            }
        });

這樣基本就是實現了我們RecyclerView的Item的點選監聽和長按監聽效果。