2016-04-03 3 views
0

Я пытаюсь достичь функциональности, видимой в Google Play, где у CardView есть меню опций, которое можно щелкнуть, и вы можете щелкнуть по карте, чтобы просмотреть более подробную информацию о карте.Android RecyclerView Clicks

Я внедрил прослушиватель OnItemTouch в моем RecyclerView, который отлично работает и реагирует, когда прикасается, переведя меня в другое действие. Однако, когда я теперь попытаюсь добавить добавление клика к значку параметров, добавленному в элемент 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 нажмём события, используйте OnClickListener для itemView, который вы получите в ViewHolder.

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 
    } 

} 

Итак, при нажатии значка параметров весь элемент управления ClickListener item не будет вызываться.

1

Если вы не хотите обрабатывать клики детей CardView, то OnItemTouchListener - это способ.

Но если вы хотите обращаться с кликами детей с картой, вам может потребоваться привязать OnClickListener (в классе Adapter «DataObjectHolder» или «onBindViewHolder») к CardView или его непосредственному ребенку (который может быть любым макетом, например LinearLayout, RelativeLayout и т. Д.) Для обработки кликов по карте. Если это будет сделано, будет работать OnClickListener любого вида внутри CardView.

Ниже приведен пример:

адаптер

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 
    } 
} 

Это очистит ваши сомнения.