如何在RecyclerView项目点击上实现两个OnClickListener?

时间:2019-05-04 14:38:26

标签: android android-recyclerview onclicklistener android-coordinatorlayout android-appbarlayout

我很困惑,因为我需要使用两个OnClickListeners来满足两个不同的需求。 我有一个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中的菜单将使用我描述的第一段代码进行更改。

谢谢帮助!

3 个答案:

答案 0 :(得分:1)

从RecyclerView.ViewHolder中删除以下代码

WARNING: errors ignored on restore: 97

然后在“ itemView”中添加列表器事件,如下所示:

g++ -o prog main.cpp float_operations.s -m32

答案 1 :(得分:0)

我希望使用我的答案来解决,您有多种方法可以解决此问题

1个使用界面

由于API发生了根本性的变化,如果您要为每个项目创建一个OnClickListener,这也不会令我感到惊讶。不过,这并不是一件麻烦事。在实现RecyclerView.Adapter时,您应该具有: 私有最终OnClickListener mOnClickListener = new MyOnClickListener();

@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
    view.setOnClickListener(mOnClickListener);
    return new MyViewHolder(view);
}

@Override
public void onClick(final View view) {
    int itemPosition = mRecyclerView.getChildLayoutPosition(view);
    String item = mList.get(itemPosition);
    Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}

2-在XML中单击使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:onClick="functionOnUrActivity">

</RelativeLayout>

并根据您的活动设置此功能

public void functionOnUrActivity(View v){
}

并在视图上设置数据,可以使用setTag

答案 2 :(得分:0)

您可以使用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();
            }
        });