#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. Спасибо, что уделили мне время. Я принял решение. Большое спасибо, Родня.