2015-05-11 43 views
1

的回收子视图包含两个可点击的对象,一个是一组TextViews和ImageView的,另外一个是一个复选框 (参见 - Android Recyclerview Multiple onclick items) 我想看看是否在儿童复选框被点击或不。如果是这样,那么我改变CheckBox的状态。 否则,我启动另一项活动(对于结果)。以上链接显示处理点击持有人。我想在我设置RecyclerView的其他活动中处理点击。如何检查被点击的recyclerview孩子该项目

//the view needs a listener 
    final GestureDetector mGestureDetector = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { 

     @Override public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

    }); 


    mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 
     @Override 
     public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
      View child = recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY()); 

      if(child!=null && mGestureDetector.onTouchEvent(motionEvent)){ 

       if(child.getId() == R.id.chk_box_pin){ 
         //checking, this didn't work 
       } 
       else { 
        TextView idView = (TextView) child.findViewById(R.id.note_id_txt_vw); 
        if (DEBUG) Toast.makeText(getActivity(), 
          "ID is " + idView.getText().toString(), Toast.LENGTH_SHORT).show(); 
        startEditNoteActivity(ActivityContract.ACTIVITY_EDIT, idView.getText().toString()); 
       } 
       return true; 
      } 

      return false; 
     } 

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

     } 
    }); 

有没有一种方法可以处理活动(而不是ViewHolder)中的子项中的多个项目的点击?

回答

1

不幸的是,您必须实现您自己的监听器才能与您的活动进行通信。

创建一个接口,在您的活动中实现它,在您的适配器上传递您的接口实例(在您的接口上转换上下文)并使用自定义参数调用您的自定义方法。

像这样,您应该可以访问您的ViewHolder(不要忘记使用适配器最佳实践实施)。

希望它有帮助!

最好。

检查:Why doesn't RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview?

+0

感谢您的答复! 它有帮助,但我不确定你希望我如何在活动X(我已经定义了recyclerview点击监听器)上调用回来的东西。我知道如果我将大部分代码迁移到适配器上,就可以完成这项工作,但是这会破坏代码模块化。而我们不希望那样:) 你能用一个小例子来详细说明吗?那将是超级。 – jinx3d

5

您始终可以创建一个将事件传递给活动的接口。 因此,例如

public interface ChildItemClickListener { 
    public void onClick(View v, int position); 
} 

然后在你的适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    /* your code*/ 
    ... 
    private ChildItemClickListener listener; 
    ... 
    */ 
    public void setChildItemClickListener(ChildItemClickListener listener) { 
     this.listener = listener; 
    } 
} 

然后调用它像这样

if(child!=null && mGestureDetector.onTouchEvent(motionEvent)) { 
       if(child.getId() == R.id.chk_box_pin){ 
         //checking, this didn't work 
       } 
       else { 
        TextView idView = (TextView) child.findViewById(R.id.note_id_txt_vw); 
        if (DEBUG) Toast.makeText(getActivity(), 
          "ID is " + idView.getText().toString(), Toast.LENGTH_SHORT).show(); 
        startEditNoteActivity(ActivityContract.ACTIVITY_EDIT, idView.getText().toString()); 
       } 
       if(listener != null) 
        listener.onClick(YOUR_VIEW, POSITION); 
       return true; 
      } 

,这将是它:)希望有帮助,祝你好运

+0

我已经upvoted它,但这不会帮助让你从活动/片段,而不是适配器管理RecyclerView的子项的点击。假设我有imageButton作为一个孩子,我已经设置clickListeners两个视图(父 - 整行和child - imageButton)点击孩子时,它将触发两个事件,因为这两个方法都采用View作为输入参数,所以整个视图被点击旁边的ImageButton(孩子)。 –

+1

我已经找到了使主要活动而不是从适配器工作的方法:)在活动中,检查view.getId()= R.id.btnid在if块内部并执行该按钮单击必须执行的操作,并在其他块做整行点击必须做的事情。 :) –

相关问题