2016-04-03 53 views
0

我試圖實現在Google Play上看到的功能,CardView具有可點擊的選項菜單,您可以點擊卡片查看卡片上的更多詳細信息。Android RecyclerView點擊

我在我的RecyclerView上實現了一個OnItemTouch偵聽器,它可以正常工作,並在觸摸時響應,帶我到另一個活動。但是,當我現在嘗試將點擊偵聽器添加到我在RecyclerView項(它是CardView)中添加的選項圖標時,會調用OnItemTouch偵聽器。誰能幫忙?

活動

mRecyclerView.addOnItemTouchListener(
      new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 
        Intent intent = new Intent(getApplicationContext(), 
          TransactionDetailActivity.class); 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable("transaction_key", mTransactionList.get(position)); 
        intent.putExtras(bundle); 
        startActivity(intent); 
       } 
      }) 
    );  mRecyclerView.setAdapter(mAdapter); 

點擊監聽器

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
    private OnItemClickListener mListener; 

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

    GestureDetector mGestureDetector; 

    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.getChildPosition(childView)); 
      return true; 
     } 
     return false; 
    } 

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

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
    } 
} 

回答

0

而不是使用OnItemTouchListener處理RecyclerView產品Click事件,使用OnClickListener爲您在ViewHolder得到ItemView控件的。

public class MyViewHolder extends RecyclerView.ViewHolder implements OnClickListener{ 
    public MyViewHolder(View itemView){ 
     super(itemView); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v){ 
     // handle click event 
    } 

} 

因此,當按下選項圖標時,整個itemView ClickListener將不會被調用。

1

如果你不想處理CardView兒童的點擊,OnItemTouchListener就是這樣。

但是,如果您想處理cardview子項的cliks,您可能需要將OnClickListener(在Adapter類的DataObjectHolder或onBindViewHolder方法中)附加到CardView或其直接子項(可以是任何佈局,例如LinearLayout, RelativeLayout等)來處理卡片點擊。如果這樣做,CardView內任何視圖的OnClickListener都可以使用。

下面是一個例子:

適配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.DataObjectHolder>{ 

    Context context; 
    ArrayList<String> list; 
    static String TAG = "ApprovalsRV Adapter"; 
    DeleteListener deleteListener; 

    public RecyclerViewAdapter(Context context, ArrayList<String> list) 
    { 
     this.context = context; 
     this.list = list; 
     deleteListener = (DeleteListener) context; 
    } 

    public static class DataObjectHolder extends RecyclerView.ViewHolder 
    { 
     TextView tName; 
     RelativeLayout rlName; 
     CardView cvName; 

     public DataObjectHolder(View itemView, final Context context) 
     { 
      super(itemView); 
      tName = (TextView) itemView.findViewById(R.id.tName); 
      rlName = (RelativeLayout) itemView.findViewById(R.id.rlName); 
      cvName = (CardView) itemView.findViewById(R.id.cvName); 

      cvName.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) { 
        //Handle the card click here 
        deleteListener.deleteName(position); // if handling from activity (explained below) 
       } 
      }); 

      tName.setOnClickListener(new View.OnClickListener() 
      { //You can have similar listeners for subsequent children 
       @Override 
       public void onClick(View view) { 
        //Handle the textview click here 
       } 
      }); 
     } 
    } 

    @Override 
    public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(context).inflate(R.layout.card_view_layout, parent, false); 
     DataObjectHolder dataObjectHolder = new DataObjectHolder(view, context); 
     return dataObjectHolder; 
    } 

    @Override 
    public void onBindViewHolder(DataObjectHolder holder, int position) 
    { 
     holder.tName.setText(list.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 
} 

如果要處理來自活動卡點擊,你就需要在這裏使用的接口。

DeleteListener.java

public interface DeleteListener { 
    public void deleteName(int position); 
} 

我們在活動中使用這樣的:

MyActivity.java

public class MyActivity extends AppCompatActivity implements DeleteListener 
{ 
    @Override 
    public void deleteName(int position) { 
     //Your job 
    } 
} 

這將清除您的疑問。