2016-09-22 131 views
1

這是我第一次使用RecyclerView,我用Adapter類做了一些靜態模擬數據。Recyclerview觸摸事件

public static class ViewHolder extends RecyclerView.ViewHolder{ 

     public TextView textView; 

     public ViewHolder(View view){ 

      super(view); 

      textView = (TextView)view.findViewById(R.id.MyTextView); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     view1 = LayoutInflater.from(context).inflate(R.layout.item, parent ,false); 

     Toast.makeText(context, "@@@@@@@@@@@@" +viewType, Toast.LENGTH_SHORT).show(); 

     viewHolder1 = new ViewHolder(view1); 

     return viewHolder1; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

     holder.textView.setText(SubjectValues[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return SubjectValues.length; 
    } 
} 

這是我Adapter CLAS現在它顯示的模擬數據我想達到的單擊事件。

+0

您的數據是否正確顯示?你在哪裏設置了適配器,請分享該代碼? –

+0

作爲begginer更好地嘗試一些教程,http://www.androidhive.info/2016/01/android-working-with-recycler-view/ – darwin

回答

0

要添加一個點擊事件添加以下到onBindViewHolder方法:

holder.textView.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        int adapterPos = holder.getAdapterPosition(); 
        if(adapterPos != RecyclerView.NO_POSITION) { 
         Toast.makeText(context, SubjectValues[adapterPos], Toast.LENGTH_SHORT).show(); 
        } 
      } 
     }); 

這將點擊監聽器添加到其顯示值的敬酒TextView的。
注意:我對你的SubjectValues是什麼做了假設,因爲沒有包括在你的問題中。

但在這裏觀察重要的事情是:

  • holder.getAdapterPosition()
  • 檢查位置(= RecyclerView.NO_POSITION!)
  • 在onBindViewHolder
  • 設置此

我相信這是如何在回收站視圖適配器中設置點擊監聽器的公平摘要。

+0

非常感謝它的工作,但有一點需要說明,爲什麼我們需要一個位置,如果已經在 'onBindViewHolder(ViewHolder持有者,最終int位置)' –

+0

位置在某些情況下'''onBindViewHolder'''的位置將工作,但我不認爲這是正確的方式。由於您的適配器中的項目位置可能在您設置點擊偵聽器後發生更改,可能是因爲它們已被刪除或移動(通常是用戶交互)。無論哪種方式,我強烈建議使用'''holder.getAdapterPosition()''',因爲它提供了一個更好的,更有前途的解決方案。當然,從我的經驗來看,它可能意味着追趕一個並不明顯的bug的時間要少很多。 –

0

這個類添加到您的項目

public RecyclerItemClickListener(Context context, OnItemClickListener listener) { 
    mListener = listener; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 
    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
    View childView = view.findChildViewUnder(e.getX(), e.getY()); 
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
     mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     return true; 
    } 
    return false; 
} 

@Override 
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
} 

public interface OnItemClickListener { 
    void onItemClick(View view, int position); 
}} 

然後在RecyclerView使用本

myRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      YourModel model = modelList.get(position); 
     } 
    })); 
0

添加OnItemClickListener接口爲您的適配器。

OnItemClickListener mItemClickListener; 

public interface OnItemClickListener { 
    public void onItemClick(View view, int position); 
} 

public void setOnItemClickListener(
     final OnItemClickListener mItemClickListener) { 
    this.mItemClickListener = mItemClickListener; 
} 

實現OnItemClickListenerViewHolder像下面。

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    public TextView textView; 

    public ViewHolder(View view){ 
     super(view); 
     textView = (TextView)view.findViewById(R.id.MyTextView); 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (mItemClickListener != null) { 
      mItemClickListener.onItemClick(v, getAdapterPosition()); 
     } 
    }  
} 

在您的活動或片段setOnItemClickListener上的適配器。

mAdapter.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      // Do your stuff here when item clicked 
     } 
    }); 
1

裏面你onBindViewHolder設置OnClickListener

@Override 
    public void onBindViewHolder(final HomeListAdapter.MainViewHolder homeViewHolder, final int position) { 

     homeViewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(this, "Item no: "+ position, LENGTH_SHORT).show; 
      } 
     }); 
} 

使用這種方式會使項目佈局點擊不僅僅是一個TextView或按鈕。 如果特別想通過單擊按鈕或textveiew進行操作,那麼您可以使用這些組件的引用,例如 holder.button.setOnClickListener(new OnClick ..)......

2

在適配器類,內onBindViewHolder()方法,就可以收聽到整個行作爲註冊以下:

vh1.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
       Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

如果要註冊監聽到行佈局,可以內部的特定視圖做到這一點,如下所示:

vh1.getButton().setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
     Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show(); 
    } 
}); 

的適配器類的全部代碼:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    switch (viewHolder.getItemViewType()) { 
     case USER: 
      ViewHolder1 vh1 = (ViewHolder1) viewHolder; 
      configureViewHolder1(vh1, position); 
      break; 
    } 
} 

private void configureViewHolder1(ViewHolder1 vh1, int position) { 
    User user = (User) items.get(position); 
    if (user != null) { 
     vh1.getLabel1().setText("Name: " + user.name); 
     vh1.getLabel2().setText("Hometown: " + user.hometown); 

     vh1.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
       Toast.makeText(v.getContext(), "General click !", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     vh1.getButton().setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(ComplexRecyclerViewAdapter.this, "Item no: "+ position, Toast.LENGTH_LONG).show; 
       Toast.makeText(v.getContext(), "Button is clicked ! ", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

ViewHolder1.java

public class ViewHolder1 extends RecyclerView.ViewHolder { 

    private TextView label1, label2; 

    private Button button; 

    public ViewHolder1(View v) { 
     super(v); 
     ... 
     button = (Button) v.findViewById(R.id.button); 
    } 

    public Button getButton() { 
     return button; 
    } 

    public void setButton(Button button) { 
     this.button = button; 
    } 
}