Android 你的侦听器在recyclerview中不工作吗?

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

嗨,我正在做一个简单的recyclerview。我还想添加一个简单的监听器。 所以我在ViewHolderClass中实现了Adapter.Onitemclicklistener,但它不起作用

我想我添加了一个错误的方式,但有人能给我的解决方案

这是我的适配器

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->{..};很好的轻质解决方案。。谢谢