首页 > 解决方案 > 如何在 RecyclerView 项目点击上实现两个 OnClickListeners?

问题描述

我很困惑,因为我需要使用两个 OnClickListener 来满足两种不同的需求。我有一个 Recyclerview,一旦他的任何项目,一旦按下,就需要更改,我已经成功地使用OnBindViewHolder.itemView.setOnClickListener

现在,我希望通过同样的点击来更新我的 BottomAppBar,为此,我向我的 ItemHolder 类添加了一个接口。问题是,现在我一旦点击,由于界面(我猜)没有任何反应。

我知道理解我的情况可能有点复杂,所以我添加了以下代码来帮助解决这个问题:

public class MainActivity extends AppCompatActivity implements MultiViewTypeAdapter.IClickListener {

有这个功能:

 @Override
    public void onItemClick(View view, int position) {
        int type = adapter.getItemViewType(position);
        if (type == 0) {
            bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_END);
            bar.replaceMenu(R.menu.bab_menu_chosen_project);
            fab.setImageDrawable(getDrawable(R.drawable.ic_message_white_24dp));
        }
        else{
            bar.setFabAlignmentMode(BottomAppBar.FAB_ALIGNMENT_MODE_CENTER);
            bar.replaceMenu(R.menu.bab_menu_primary);
            fab.setImageDrawable(getDrawable(R.drawable.ic_reply_black_24dp));
        }

    }

适配器上的界面如下所示:

public interface IClickListener {
        void onItemClick(View view, int position);
    }

我目前正在做的 public static class SelectedProjectItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 是:

@Override
        public void onClick(View v) {
            listener.onItemClick(v, getAdapterPosition());
        }

但是,我想要运行的是我正在做的事情

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {

是:

((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dataSet.remove(listPosition);
                        dataSet.add(listPosition, unselectedCards.get(listPosition));
                        notifyItemChanged(listPosition);
                    }
                });

我希望一次单击会发生两件事 - Recyclerview 上的项目将使用我描述的最后一段代码更改,我的 MainActivity 中的菜单将使用我描述的第一段代码更改。

感谢帮助!

标签: androidandroid-recyclerviewonclicklistenerandroid-coordinatorlayoutandroid-appbarlayout

解决方案


从 RecyclerView.ViewHolder 中删除以下代码

@Override
public void onClick(View v) {
    listener.onItemClick(v, getAdapterPosition());
}

并在“itemView”中添加listner事件,点击如下:

((SelectedProjectItemHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(listener != null){
                            listener.onItemClick(v, getAdapterPosition());
                        }
                        dataSet.remove(listPosition);
                        dataSet.add(listPosition, unselectedCards.get(listPosition));
                        notifyItemChanged(listPosition);
                    }
                });

推荐阅读