首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView onItemClickListener

RecyclerView onItemClickListener
EN

Stack Overflow用户
提问于 2017-03-10 23:06:48
回答 5查看 9.8K关注 0票数 2

我希望建立一个程序,其中有人将点击从文本列表,这将把他们带到另一个活动。

我知道RecyclerView没有像ListView那样的点击监听器,但是经过几次尝试,我还是不能让它工作。

下面是我尝试实现的代码:

MyChatRecyclerViewAdapter.java

代码语言:javascript
复制
public class MyChatRecyclerViewAdapter extends RecyclerView.Adapter<MyChatRecyclerViewAdapter.ViewHolder> {

    private final List<Chat> mValues;
    private final OnItemClickListener listener;
    //private final OnListFragmentInteractionListener mListener;

    public MyChatRecyclerViewAdapter(List<Chat> items, OnItemClickListener listener) {
        this.mValues = items;
        //mListener = listener;
        this.listener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.fragment_chat, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);
        holder.mIdView.setText(mValues.get(position).id);
        holder.bind(mValues.get(position), listener);
        holder.mContentView.setText(mValues.get(position).content);

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != listener) {
                    // Notify the active callbacks interface (the activity, if the
                    // fragment is attached to one) that an item has been selected.
                    listener.onListFragmentInteraction(holder.mItem);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mValues.size();
    }


    public interface OnItemClickListener {
        //public void onItemClick(View view , int position);
        void onItemClick(Chat item);
    }


    public class ViewHolder extends RecyclerView.ViewHolder{
        public final View mView;
        public final TextView mIdView;
        public final TextView mContentView;
        public Chat mItem;
        OnItemClickListener mItemClickListener;

        /*@Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, getPosition());
            }
        }*/

        public ViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
            mIdView = (TextView) itemView.findViewById(R.id.id);
            mContentView = (TextView) itemView.findViewById(R.id.content);
        }

        public void bind(final Chat item, final OnItemClickListener listener){

            itemView.setOnClickListener(new View.OnClickListener(){
                @override
                public void onClick(View v){
                    listener.onItemClick(item);
                }
            });
        }

        @Override
        public String toString() {
            return super.toString() + " '" + mContentView.getText() + "'";
        }
    }
}

这是我尝试遵循的教程:https://antonioleiva.com/recyclerview-listener/

EN

回答 5

Stack Overflow用户

发布于 2017-03-10 23:17:00

RecyclerView中,视图被回收以提高性能。你不应该把OnClickListener放在onBindViewHolder里面,因为它的位置并不总是正确的。尝试将OnClickListener移动到ViewHolder的构造函数中,并通过调用getAdapterPosition()来获取当前位置:

代码语言:javascript
复制
public ViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        mIdView = (TextView) itemView.findViewById(R.id.id);
        mContentView = (TextView) itemView.findViewById(R.id.content);

        mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final int position = getAdapterPosition();
                if (null != listener) {     
                    listener.onListFragmentInteraction(mValues.get(position));
                }
           }
    });
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-10 23:16:30

在您的MyChatRecyclerViewAdapter中添加以下方法:

代码语言:javascript
复制
public void setClickListener(OnItemClickListener listener) {
this.listener = listener;
}

并调用

代码语言:javascript
复制
mAdapter.setClickListener(new MyChatRecyclerViewAdapter.OnItemClickListener() {

            @Override
            public void onItemClick(Chat chat) {

            }
});

来自您的活动/片段类

票数 0
EN

Stack Overflow用户

发布于 2017-03-10 23:19:57

您正在设置onclick listener 2次。1在onBind()中,1在视图控制符中。

从绑定()和视图持有者中删除,使用侦听器对象将事件传递给特定的侦听器。

代码语言:javascript
复制
Layout.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View view) {
                    if (getListener() != null) {
                        getListener().onLayoutClick(view, this.getAdapterPosition());
                    }
                }
            });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42721571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档