#java #android #android-recyclerview #android-viewholder
#java #Android #android-recyclerview #android-viewholder
Вопрос:
Проблема: я пытаюсь условно удалить компонент линейной компоновки элемента в представлении recycler внутри раздела onBindViewHolder адаптера, но я не могу понять, как получить доступ к предыдущему представлению для этого. Как мне это сделать? Следующее работает для самого последнего добавленного элемента, но как мне сделать это для ранее добавленных элементов? Это происходит внутри адаптера, поэтому у меня нет прямого доступа к RecyclerView или layoutmanager.
if (holder.mContainer.getParent() != null) {
((ViewGroup) holder.mEmotionLayout.getParent()).removeView(holder.mEmotionLayout);
}
holder.mMainLayout.addView(holder.mEmotionLayout, 1);
Пожалуйста, дайте мне знать, если вам нужно, чтобы я что-нибудь добавил к сообщению. Спасибо.
Обновление: я попытался передать диспетчер линейной компоновки адаптеру, как показано ниже, а затем попытался удалить рассматриваемые представления с помощью последующего кода, но findViewById всегда возвращает null.
private LinearLayoutManager linearLayoutManager;
public ChatAdapter(LinearLayoutManager linearLayoutManager) {
this.linearLayoutManager = linearLayoutManager;
Внутри onBindViewHolder:
((ViewGroup) linearLayoutManager.getChildAt(position-1).findViewById(R.id.emotionLayout).getParent()).removeView(linearLayoutManager.getChildAt(position-1).findViewById(R.id.emotionLayout));
Решено: удалось добиться некоторого успеха с использованием списков массивов для хранения старых держателей представлений, но иногда я сталкивался с исключениями, выходящими за рамки, из-за которых приложение выходило из строя после его перезапуска или перезагрузки действия.
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
//within onBindViewHolder
private ArrayList mainLinearLayouts = new ArrayList();
private ArrayList emotionLinearLayouts = new ArrayList();
mainLinearLayouts.add(holder.mMainLayout);
emotionLinearLayouts.add(holder.mEmotionLayout);
if (position > 0) {
if (chatList.get(position - 1).getCurrentUser()) {
LinearLayout mll = (LinearLayout) mainLinearLayouts.get(position - 1);
LinearLayout ell = (LinearLayout) emotionLinearLayouts.get(position - 1);
mll.removeView(ell);
}
}