2016-09-22 181 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; 
    } 
}