如何使用 java 将所选项目(我的 recyclerview 中的多个项目)值从适配器传递到 android 中的片段

How to pass the selected items (multiple items in my recyclerview) values from the adapter to the fragment in android using java

我的应用程序中有一个回收站视图列表。它有 select 和 unselect 选项。在 select 编辑项目后,我需要使用该 selected 列表创建一个特定项目。

所以我在我的片段中添加了创建按钮,并在我的适配器 onBindViewHolder 中显示了 selection 和 unselection。

这里我需要将 selected item 的值发送到 fragment 并且需要在 fragment 中设置 post 调用。

我的片段:

mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(mAdapter);

        mcreatevendorlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                execute(new InitiationRequest("FINTesting", mcreate.getName()), mCreateInitiationListener);
                mAdapter.setOnItemClickListner(new MembersAdapter.onItemClickListner() {
                    @Override
                    public void onClick(User str) {

                    }
                });
            }
        }); 

我的适配器:

  MembersAdapter.onItemClickListner onItemClickListner;
    
     public void setOnItemClickListner(MembersAdapter.onItemClickListner onItemClickListner) {
            this.onItemClickListner = onItemClickListner;
        }
    
        public interface onItemClickListner{
            void onClick(User str);//pass your object types.
        }
    @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            User message = (User) mModelList.get(position);
    
    holder.select_Add.setOnClickListener(new View.OnClickListener() {
                @SuppressLint("ResourceAsColor")
                @Override
                public void onClick(View view) {
                    message.setSelected(!message.isSelected());
                   holder.select_Add.setText(message.isSelected() ? "ADDED" : "Add");
                }
            });
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onItemClickListner.onClick(message);
                }
            });
    }

我的 mainxml:

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/create_vendorlist"
        android:text="Create Vendor"
        android:textColor="@color/black"
        android:background="@drawable/background"
        android:layout_gravity="center"
        android:padding="15dp"
        android:layout_margin="15dp"
        android:textSize="15sp"
        android:fontFamily="@font/cachet_std_medium"
        >
     <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@null"/>
    </LinearLayout>

Listview.xml:

       <TextView
            android:id="@+id/tv_username"
            style="@style/Username"
            android:layout_alignParentLeft="@+id/myCardView"
            android:paddingTop="@dimen/spacing_d2"
            tools:text="UserName"/>
        <CheckBox
            android:id="@+id/tv_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onCheckboxClicked"
            android:buttonTint="@color/white"
            android:gravity="center"
            />

首先创建列表来存储所有选中的消息

private final ArrayList<User> selected;

并在您的构造函数上初始化此数组。

然后在onBindViewHolder上添加这个方法来保存选中的或者移除未选中的

   User message = (User) mModelList.get(position);
   // rest of your code here 
   holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                User message = (User) mModelList.get(position);
                if (holder.checkBox.isChecked()){
                    selected.add(message );
                }else{
                    selected.remove(message );
                }
            }
        });

然后在您的适配器上创建此方法以从片段访问它:

 public ArrayList<User> getSelected() {
        return selected;
    }

在您的片段上,您可以在单击按钮时获得所选列表:

  btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ArrayList<User> selectedList=adapter.getSelected();
            }
        });

编辑

您还可以在用户 class 中添加一个名为 isSelected 的布尔值,如下所示:

public class User {
    // your variable 
    boolean isSelected;

    
    /*
        rest of setter and getter 
     */
    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

然后在您的 onBindViewHolder 上为您的复选框添加一个侦听器,如下所示:

  public void onBindViewHolder(@NonNull UserHolder holder, int position) {

        /*
        rest of your code
         */
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user.setSelected(holder.checkBox.isChecked());
            }
        });
    }

要获取您的列表,请在您的适配器中添加此方法:

public ArrayList<User> getSelected() {
    ArrayList<User> selected = new ArrayList<>();
    for (User u : modelList) {
        if (u.isSelected) {
            selected.add(u);
        }
    }
    return selected;
}