【问题标题】:Implement both OnItemClickListener and OnItemLongClickListener on RecyclerView在 RecyclerView 上同时实现 OnItemClickListener 和 OnItemLongClickListener
【发布时间】:2018-04-19 13:57:35
【问题描述】:

我想在我的 Recycler 视图上同时实现 OnItemClickListener 和 OnItemLongClickListener。我使用 Android 库 BRVAH 来设置适配器。

我期待 OnItemLongClickListener 的自定义声明,以便我可以将它放在我的(已经实现的)OnItemClickListener 上。

    mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
        public void onItemClick(BaseQuicAdapter adapter, final View view, int position) {
        .....
        }
    });

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

你必须做两个接口来处理点击事件和长点击事件到recyclview的适配器中。

就像把下面的接口变成适配器类..

onItemClickListner onItemClickListner;
onItemLongClickListner onItemLongClickListner;

public void setOnItemLongClickListner(RecyclerViewAdpater.onItemLongClickListner onItemLongClickListner) {
    this.onItemLongClickListner = onItemLongClickListner;
}

public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner {
    void onClick(String str);//pass your object types.
}
public interface onItemLongClickListner{
    void onLongClick(String str);
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    String data = mStringList.get(position); // if you pass object of class then create that class object.
    holder.textView.setText(data);
    // below code handle click event on recycler view item.
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            onItemLongClickListner.onLongClick("Hiii");
            return false;
        }
    });
}

然后在适配器定义和绑定到回收器视图之后定义回收器视图时在活动中然后获得两个点击事件,如下所示..

recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
        @Override
        public void onClick(String str) {
            Toast.makeText(getApplicationContext(),"Value of Click"+str,Toast.LENGTH_SHORT).show();
        }
    });
    recyclerViewAdpater.setOnItemLongClickListner(new RecyclerViewAdpater.onItemLongClickListner() {
        @Override
        public void onLongClick(String str) {
            Toast.makeText(getApplicationContext(),"Value of Long Click"+str,Toast.LENGTH_SHORT).show();

        }
    });

【讨论】:

    【解决方案2】:

    您可以使用库的以下方法。

       /**
         * Register a callback to be invoked when an item in this RecyclerView has
         * been long clicked and held
         *
         * @param listener The callback that will run
         */
        public void setOnItemLongClickListener(OnItemLongClickListener listener) {
            mOnItemLongClickListener = listener;
        }
    

    所以在你的代码中实现它

        mAdapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
        boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
        .....
        }
    

    【讨论】:

    • 我试过了,但这让我的 OnItemClickListener 停止工作。还是谢谢。
    • 根据库代码,它应该可以正常工作。设置好两个监听器后能贴出代码吗?
    【解决方案3】:

    进入你的适配器并找到 ViewHolder 类并编写以下代码

      public class MyViewHolder extends RecyclerView.ViewHolder{
    
            public MyViewHolder(View itemView) {
                super(itemView);
    
                itemView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //call onClick handler here  
                    }
                });
    
                itemView.setOnLongClickListener(new OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View view) {
                        //call onLongClick handler here                        //Here you will return true
                        return true;
                    }
                });
    
            }
        }
    

    然后创建两个类似的接口

     public interface OnMyLongClickListener{
            void onLongClick(int pos);
        }
        public interface OnMyClickClickListener{
            void onClick(int pos);
        }
    

    在您的活动或片段类中实现这两个接口,然后在接收事件中调用这些接口方法

    【讨论】:

    • 他正在为适配器使用库。他没有自定义适配器
    • 对不起 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多