[英]Recyclerview touch events
This is the first time I am working with RecyclerView
, I have made Adapter
class with some static mock data. 这是我第一次使用
RecyclerView
,使Adapter
类具有一些静态模拟数据。
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;
}
}
this is my Adapter
clas now it's showing the mock data I want to achieve the click event. 这是我的
Adapter
现在它显示了我想要实现click事件的模拟数据。
In Adapter class, inside onBindViewHolder() method, you can register listener to the whole row as the following : 在Adapter类的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();
}
});
If you want to register listener to a specific view inside a row layout, you can do it as the following : 如果要在行布局内将侦听器注册到特定视图,则可以按照以下步骤进行操作:
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();
}
});
The whole source code for the adapter class : 适配器类的整个源代码:
@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 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;
}
}
Inside your onBindViewHolder set OnClickListener 在您的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;
}
});
}
Using this way will make items layout clickable not only a textview or button. 使用这种方式将使项目布局不仅可以单击文本视图或按钮,还可以单击。 If perticularly you want to give action on click of button or textveiew then you can use reference of those components eg holder.button.setOnClickListener(new OnClick..)......
如果您特别想在单击按钮或文本窗口时采取措施,则可以使用这些组件的引用,例如holder.button.setOnClickListener(new OnClick ..)......
To add a click event add the following into the onBindViewHolder method: 要添加点击事件,请将以下内容添加到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();
}
}
});
That would add a click listener to the textView which shows a toast of the value. 这会将一个单击侦听器添加到显示该值的textView。
Note: I have made assumptions on what your SubjectValues is, as not included in your question. 注意:我对您的SubjectValues是什么进行了假设,这没有包含在您的问题中。
But the important things to observe here are: 但是要注意的重要事项是:
I believe this is a fair summary of how to set a click listener within a recyclerview adapter. 我相信这是有关如何在recyclerview适配器中设置点击侦听器的合理总结。
add this class to your project 将此课程添加到您的项目中
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);
}}
then in your RecyclerView use this 然后在您的RecyclerView中使用此
myRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
YourModel model = modelList.get(position);
}
}));
Add OnItemClickListener
interface into your adapter. 将
OnItemClickListener
接口添加到您的适配器中。
OnItemClickListener mItemClickListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
public void setOnItemClickListener(
final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
Implements OnItemClickListener
on ViewHolder
like below. 实现
OnItemClickListener
上ViewHolder
像下面。
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());
}
}
}
In your Activity or Fragment setOnItemClickListener
on your adapter. 在适配器上的Activity或Fragment
setOnItemClickListener
。
mAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// Do your stuff here when item clicked
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.