如何在 RecyclerView item click 上实现两个 OnClickListeners?

How to implement two OnClickListeners on RecyclerView item click?

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

成功实现了它

现在,我想要同一次点击来更新我的 BottomAppBar,为此,我向我的 ItemHolder class 添加了一个界面。问题是现在我一旦点击,由于界面的原因(我猜)没有任何反应。

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

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 中的菜单将使用我描述的第一段代码更改。

谢谢帮助!

从 RecyclerView.ViewHolder

中删除以下代码
@Override
public void onClick(View v) {
    listener.onItemClick(v, getAdapterPosition());
}

并在"itemView"中添加监听事件点击如下:

((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);
                    }
                });

您可以使用 UIHandler 或 MainLoop 将 BottomBar 宽度更改为相同(唯一)单击,您可以使用它们从适配器访问 UI。 在你的 OnCreate 上:

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 //.....
Handler uiHandle = new Handler(getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle b = (Bundle) msg.obj;
            int p = b.getInt("position");
            Toast.makeText(MainActivity.this, "Change here your BottomBAR",     Toast.LENGTH_SHORT).show();

        }
    };

.. 并且在您的适配器中...

 yourobjectclick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

           // example: first change color of my object that I have clicked
                ((TextView)v).setTextColor( mContext.getResources().getColor(R.color.blue_100));
                Bundle bundle = new Bundle();
               //i can store the position about click and
                bundle.putInt("position",position);

                Message message = handler.obtainMessage();
                message.obj = bundle;
                // i have access tu User Interface objects from here

           // next change my bottombar sending a message to UI
           handler.sendMessage(message);
                Toast.makeText(mContext, "onClick: su -> "+tvBikeName.getText(), Toast.LENGTH_SHORT).show();
            }
        });