Проблема с выбором элемента RecyclerView после фильтрацииAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Проблема с выбором элемента RecyclerView после фильтрации

Сообщение Anonymous »

Я столкнулся с проблемой выбора элемента в RecyclerView после применения фильтрации. Вот сценарий:
У меня есть RecyclerView, отображающий список элементов с использованием специального адаптера (PayloadAdapter). Адаптер обеспечивает функцию фильтрации на основе имени сервера. Однако после фильтрации списка и выбора элемента выбор не соответствует правильному элементу в исходном нефильтрованном списке.
Например, если я отфильтрую список и выберу первый элемент в отфильтрованном списке, он выбирает первый элемент в нефильтрованном списке по умолчанию, и то же самое относится к выбору второго, третьего и последующих элементов.
Я подозреваю, что проблема заключается в том, как Я обрабатываю выбор элементов после фильтрации списка. Как я могу гарантировать, что выбранный элемент соответствует правильному элементу в исходном нефильтрованном списке?
Класс PayloadAdapter:

Код: Выделить всё

public class PayloadAdapter extends RecyclerView.Adapter
 implements Filterable {

private final List payloadList;
public SimpleDraweeView selectedSImage;
private OnItemClickListener listener;
private final List payloadListFiltered;

public PayloadAdapter(List payloadList) {
this.payloadList = payloadList;
this.payloadListFiltered = payloadList;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_item, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
PayloadModel payload = payloadList.get(position);
holder.bind(payload);
}

@Override
public int getItemCount() {
return payloadList.size();
}

@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String query = charSequence.toString().toLowerCase().trim();
List filteredList = new ArrayList();
if (query.isEmpty()) {
filteredList.addAll(payloadList);
} else {
for (PayloadModel payload : payloadList) {
if (payload.getServerName().toLowerCase().contains(query)) {
filteredList.add(payload);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}

@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
payloadListFiltered.clear();
payloadListFiltered.addAll((List) filterResults.values);
notifyDataSetChanged();
}
};
}

private void loadPayloadIcon() {
neth("ze");
}

public void neth(String pogiko) {

String flagUrl = "" + pogiko + ".webp";

selectedSImage.setImageURI(flagUrl);
}

public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}

public interface OnItemClickListener {
void onItemClick(int position);
}

public class ViewHolder extends RecyclerView.ViewHolder {
TextView nameTextView, infoTextView;

public ViewHolder(@NonNull View itemView) {
super(itemView);
nameTextView = itemView.findViewById(R.id.itemNamea);
infoTextView = itemView.findViewById(R.id.sinf);
selectedSImage = itemView.findViewById(R.id.itemImagea);
}

public void bind(PayloadModel payload) {
nameTextView.setText(payload.getServerName());
infoTextView.setText(payload.getPayloadInfo());
loadPayloadIcon();
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
}
}

}
PayloadActivity

Код: Выделить всё

public class PayloadActivity extends BaseActivity implements PayloadAdapter.OnItemClickListener {
EditText editTextSearch;
private wamp config;
private Settings mConfig;
private List
  payloadList;
private PayloadAdapter adapter;
private RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.server);

final EditText editTextSearch = findViewById(R.id.editTextSearch);

payloadList = new ArrayList();
recyclerView = findViewById(R.id.recyclerView);

recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new PayloadAdapter(payloadList);
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(this);

loadPayloadData();

editTextSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}

@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
adapter.getFilter().filter(charSequence);
}

@Override
public void afterTextChanged(Editable editable) {
}
});
}
Я попытался настроить прослушиватель кликов в классе ViewHolder, чтобы он извлекал правильный элемент из исходного списка (payloadList) вместо использования позиции из отфильтрованного списка (payloadListFiltered).
В частности, я изменил метод onClick в классе ViewHolder, чтобы использовать payloadList.get(getAdapterPosition()) для извлечения правильного элемента из исходного списка и передачи его позиции прослушивателю.Я ожидал, что при получении элемента из исходного списка выбранный элемент будет соответствовать правильному элементу в нефильтрованном списке, независимо от фильтрации.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -filtering
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»