Как передать значения выбранных элементов (несколько элементов в моем просмотре вторсырья) из адаптера во фрагмент в Android с помощью java

#android #android-recyclerview #android-adapter

Вопрос:

У меня в приложении есть список просмотра переработчиков. Там у него есть опция выбора и отмены выбора. После выбора элементов мне нужно создать конкретный элемент с этим выбранным списком.

Поэтому я добавил кнопку «Создать» в свой фрагмент и показал выбор и отмену выбора в своем адаптере на Bindviewholder.

Здесь мне нужно отправить значение выбранного элемента во фрагмент и установить вызов 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);
                }
            });
    }
 

Моя главная цель:

  <?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"
            />
 

Комментарии:

1. что случилось? вам нужно отправить список выбранных элементов из адаптера во фрагмент? почему бы не отправить список из вашего интерфейса onClick(List<User> str)

2. Да, мне нужно отправить выбранные элементы из адаптера во фрагмент. Можете ли вы дать какой-либо образец. Я выбираю некоторые элементы в адаптере, затем мне нужно отправить выбранные элементы во фрагмент?

3. на каком событии вы хотите получить этот выбранный список, у вас есть кнопка на вашем фрагменте или что-то еще?

4. У меня есть кнопка на моем фрагменте (мой основной файл). Но список(у listview есть флажок) выбран внутри адаптера на держателе bindviewholder.

Ответ №1:

Сначала создайте список для хранения всех выбранных сообщений

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

Редактировать

Вы также можете добавить логическое значение с именем 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;
}
 

Комментарии:

1. Я получаю java.lang. Исключение NullPointerException: Попытка вызвать виртуальный метод ‘java.lang. Объект java.util. ArrayList.get(int)’ по нулевой ссылке на объект. Примечание: В моей модели нет выбранного значения, в объекте есть только имя пользователя, изображение. Тогда как я могу установить это логическое значение выбранным

2. В этой строке выбрано.добавить(сообщение );

3. Вы инициализировали выбранный список?

4. Спасибо @Shay Kin. Крэш уходит. У меня есть разъяснение. После успешного выбора отображается вся модель в массиве.[com.model.user, com.model.user] Но мне нужно получить только название от этой модели. [«пользователь1», «пользователь2»]. Как я могу получить только это значение только из этой модели

5. Спасибо, что уделили мне время. Я принял решение. Большое спасибо, Родня.