Android 你的侦听器在recyclerview中不工作吗?
嗨,我正在做一个简单的recyclerview。我还想添加一个简单的监听器。 所以我在ViewHolderClass中实现了Adapter.Onitemclicklistener,但它不起作用 我想我添加了一个错误的方式,但有人能给我的解决方案 这是我的适配器Android 你的侦听器在recyclerview中不工作吗?,android,android-recyclerview,Android,Android Recyclerview,嗨,我正在做一个简单的recyclerview。我还想添加一个简单的监听器。 所以我在ViewHolderClass中实现了Adapter.Onitemclicklistener,但它不起作用 我想我添加了一个错误的方式,但有人能给我的解决方案 这是我的适配器 package com.example.niyamat.golfscoreboard; import android.content.Context; import android.support.v7.widget.Recycler
package com.example.niyamat.golfscoreboard;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
* Created by Niyamat on 12/3/2015.
*/
public class ScoreBoardAdapter extends RecyclerView.Adapter<ScoreBoardAdapter.ScoreBoardViewHolder> {
private Context mContext;
private Hole[] mHoles;
public ScoreBoardAdapter(Context context, Hole[] holes) {
mContext = context;
mHoles = holes;
}
@Override
public ScoreBoardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.scoreboard_layout, parent, false);
return new ScoreBoardViewHolder(view);
}
@Override
public void onBindViewHolder(ScoreBoardViewHolder holder, int position) {
holder.mHoleName.setText(mHoles[position].getHoleName());
}
@Override
public int getItemCount() {
return mHoles.length;
}
public class ScoreBoardViewHolder extends RecyclerView.ViewHolder implements AdapterView.OnItemClickListener{
public TextView mHoleName;
public TextView mResultLabel;
public ScoreBoardViewHolder(View itemView) {
super(itemView);
mHoleName = (TextView) itemView.findViewById(R.id.holeName);
mResultLabel = (TextView) itemView.findViewById(R.id.resultNumber);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position == 3) {
Toast.makeText(mContext, "Yey we got it",Toast.LENGTH_LONG).show();
}
}
}
}
两步解决方案:
1使用自定义侦听器RecyclerItemClickListener获取单击:
mRecyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// TODO Handle item click
Toast.makeText(getApplicationContext(), (position).toString(), Toast.LENGTH_LONG).show();
}
})
);
2 RecyclerItemClickListener.的完整代码列表。。将此类添加到代码中:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
GestureDetector mGestureDetector;
private OnItemClickListener mListener;
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 false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
}
两步解决方案:
1使用自定义侦听器RecyclerItemClickListener获取单击:
mRecyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// TODO Handle item click
Toast.makeText(getApplicationContext(), (position).toString(), Toast.LENGTH_LONG).show();
}
})
);
2 RecyclerItemClickListener.的完整代码列表。。将此类添加到代码中:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
GestureDetector mGestureDetector;
private OnItemClickListener mListener;
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 false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
}
这是最好的方法
最简单的方法是在本教程中有一个工作侦听器的实现:在本教程中有一个工作侦听器的实现:您不应该在您的ViewHolder中使用OnItemClickListener。您也从未设置哪个视图应该使用侦听器。相反,您应该使用View.OnClickListener,它将为适配器中的每个视图设置OnClickListener: 此外,如果您想回调您的活动或片段,这是迄今为止我发现的最简单的方法:
public class ScoreBoardAdapter extends RecyclerView.Adapter<ScoreBoardAdapter.ViewHolder> {
public interface OnItemClickListener {
void onItemSelected(Hole hole);
}
private OnItemClickListener mOnItemClickListener;
private Hole[] mHoles;
public final class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView mHoleName;
public TextView mResultLabel;
public ViewHolder(View itemView) {
super(itemView);
mHoleName = (TextView) itemView.findViewById(R.id.holeName);
mResultLabel = (TextView) itemView.findViewById(R.id.resultNumber);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
mOnItemClickListener.onItemSelected(mHoles[getAdapterPosition()]);
}
}
public void setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
}
// The rest of your ScoreBoardAdapter code
...
}
这将为您的OnItemClickListener返回一个孔对象,但您可以将OnItemClickListener.onItemSelected方法设置为接受适配器可以提供的任何对象。您不应该在ViewHolder中使用OnItemClickListener。您也从未设置哪个视图应该使用侦听器。相反,您应该使用View.OnClickListener,它将为适配器中的每个视图设置OnClickListener: 此外,如果您想回调您的活动或片段,这是迄今为止我发现的最简单的方法:
public class ScoreBoardAdapter extends RecyclerView.Adapter<ScoreBoardAdapter.ViewHolder> {
public interface OnItemClickListener {
void onItemSelected(Hole hole);
}
private OnItemClickListener mOnItemClickListener;
private Hole[] mHoles;
public final class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView mHoleName;
public TextView mResultLabel;
public ViewHolder(View itemView) {
super(itemView);
mHoleName = (TextView) itemView.findViewById(R.id.holeName);
mResultLabel = (TextView) itemView.findViewById(R.id.resultNumber);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
mOnItemClickListener.onItemSelected(mHoles[getAdapterPosition()]);
}
}
public void setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
}
// The rest of your ScoreBoardAdapter code
...
}
这将为您的OnItemClickListener返回一个孔对象,但您可以将OnItemClickListener.onItemSelected方法设置为接受适配器可以提供的任何对象。这是一个很好的代码。将listener设置为viewholder。这个解决方案使用Android数据绑定非常简单,非常容易,它引用了adapter类受保护的void updateBinding中的ViewDataBinding绑定。因此,在我的代码中,我有一个新闻提要的布局和视图,它是newsItemBinding.layoutNewsItem.SetOnClickListenrv->{..};很好的轻质解决方案。。谢谢这是很好的代码。将listener设置为viewholder。这个解决方案使用Android数据绑定非常简单,非常容易,它引用了adapter类受保护的void updateBinding中的ViewDataBinding绑定。因此,在我的代码中,我有一个新闻提要的布局和视图,它是newsItemBinding.layoutNewsItem.SetOnClickListenrv->{..};很好的轻质解决方案。。谢谢