【问题标题】:android studio: help RecyclerView Click does not workandroid studio:帮助 RecyclerView 点击不起作用
【发布时间】:2019-03-05 21:32:49
【问题描述】:

我正在尝试从 Main 类中的 RecyclerView 执行点击事件,但它没有捕捉到点击。

界面

public interface OnItemClickListener {
    void onItemClick(int posicao);
    void onItemLongClick(int posicao);
}

接口属性和设置器

private OnItemClickListener mlistener;

public void setOnItemClickListener(OnItemClickListener listener){
    mlistener = listener;
}

类 ViewHolder

public class ViewHolderArtista extends RecyclerView.ViewHolder{

    public ViewHolderArtista(@NonNull View itemView,  final OnItemClickListener listener) {
        super(itemView);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        listener.onItemClick(position);
                    }
                }
            }
        });

        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        listener.onItemLongClick(position);
                    }
                }
                return true;
            }
        });
    }

}

在主类中实现:

artistaAdapter.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(int posicao) {
        Log.d("TESTE", "CLIQUE CURTO" +posicao);
    }

    @Override
    public void onItemLongClick(int posicao) {
        Log.d("TESTE", "CLIQUE LONGO" +posicao);
    }
});

但是,单击时没有任何反应:

也就是我在主类中实现了RecyclerView的点击事件,但是它不起作用,它没有捕捉到被点击的item的位置。

【问题讨论】:

  • @azurefrog 再次查看问题,以便您理解。
  • 您是否尝试在其构造函数中将新的OnItemClickListener 传递给artistaAdapter?看起来您只在 View 那里注册了侦听器,而不是在 SetOnItemClickListener() 中。
  • @azurefrog 是的,我试过了,但我觉得这样更实用、更简单,因为我只得到了特定的点击事件。只是那不起作用,有几个教程这样做并且它起作用,除了我的:(
  • 有人帮忙吗?
  • 您是否检查过您是否正确发送了监听器?尝试评论if (listener != null){

标签: java android android-recyclerview


【解决方案1】:

不要在构造中设置OnClickListener,而是重写onBindViewHolder函数,在里面设置onClickListener

【讨论】:

  • 如果我使用这个方法,我将如何在主类中使用它?
  • 我的意图是在主类或任何其他类中使用点击事件。
【解决方案2】:

不要在 VIEWHOLDER 类中使用点击监听器

它将始终返回 null,因为它不会初始化。

在 recyclerview Adapter 的 onBindViewHolder() 方法中使用点击监听器。

【讨论】:

  • 如果我使用这个方法,我将如何在主类中使用它?
  • 我的意图是在主类或任何其他类中使用点击事件。
  • 在主类中创建适配器,应该很容易实现
  • 这就是我在问题中显示的内容,但实例化适配器仅显示在 ViewHolder 中创建的函数,而不是在 onBindViewHolder 中创建的函数。如果你能更清楚,我谢谢你。
  • 让我猜你想在执行点击事件时访问主类,对吧??而不是在主活动中创建适配器。如果你想访问特定的数学或视图,你可以得到它
【解决方案3】:

您可以按照其他人所说的将侦听器设置为onBindViewHolder,或者我有一个recyclerView 动作类为onClickonLongClick

import android.support.v7.widget.RecyclerView;
import android.view.View;

public class ItemClickSupport {
    private final RecyclerView mRecyclerView;
    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                // ask the RecyclerView for the viewHolder of this view.
                // then use it to get the position for the adapter
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
        }
    };
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            if (mOnItemLongClickListener != null) {
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
            return false;
        }
    };
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener
            = new RecyclerView.OnChildAttachStateChangeListener() {
        @Override
        public void onChildViewAttachedToWindow(View view) {
            // every time a new child view is attached add click listeners to it
            if (mOnItemClickListener != null) {
                view.setOnClickListener(mOnClickListener);
            }
            if (mOnItemLongClickListener != null) {
                view.setOnLongClickListener(mOnLongClickListener);
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {

        }
    };

    private ItemClickSupport(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        // the ID must be declared in XML, used to avoid
        // replacing the ItemClickSupport without removing
        // the old one from the RecyclerView
        mRecyclerView.setTag(R.id.item_click_support, this);
        mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
    }

    public static ItemClickSupport addTo(RecyclerView view) {
        // if there's already an ItemClickSupport attached
        // to this RecyclerView do not replace it, use it
        ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
        if (support == null) {
            support = new ItemClickSupport(view);
        }
        return support;
    }

    public static ItemClickSupport removeFrom(RecyclerView view) {
        ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
        if (support != null) {
            support.detach(view);
        }
        return support;
    }

    public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
        return this;
    }

    public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClickListener = listener;
        return this;
    }

    private void detach(RecyclerView view) {
        view.removeOnChildAttachStateChangeListener(mAttachListener);
        view.setTag(R.id.item_click_support, null);
    }

    public interface OnItemClickListener {

        void onItemClicked(RecyclerView recyclerView, int position, View v);
    }

    public interface OnItemLongClickListener {

        boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
    }
}  

别忘了导入<package>.R

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2013-02-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多