Элементы RecyclerView иногда не отображаются правильно, пока я не прокручиваю (только на планшетах Genymotion)
Я работаю над простой системой POS для ресторана, и у меня внезапно возникла проблема. Эта проблема возникала только при запуске его на планшетном устройстве Genymotion. У меня нет этой проблемы на меньших устройствах genymotion или на 2 физических устройствах, которые я пробовал.
Одно из моих занятий использует 5 RecyclerViews для отображения меню и сводки продаж. Каждые несколько щелчков по элементам RecyclerViews решают просто не обновлять и не отображают должным образом мои элементы, если я не прокручиваю ЛЮБОЙ из RecyclerViews или что-то щелкаю. Даже при том, что они не отображаются должным образом, все щелчки элемента регистрируют то, что должно быть показано (а не то, что на самом деле показано).
Например, я нажимаю на говядину -> морепродукты -> курицу. RecyclerView, отвечающий за отображение пунктов меню, по-прежнему показывает морепродукты. Если я нажму на что-нибудь, будет выбран правильный куриный предмет, и все обновится до того, что должно появиться. Если я прокручиваю любой RecyclerView (даже не связанный), все обновляется правильно.
Деятельность onCreate():
...
cAdapter = new CategoryAdapter();
cAdapter.setOnItemClickListener(new OnItemClickAdapter<Category>() {
@Override
public void onItemClick(Category item, int position) {
miAdapter.setItems(item.getMenuItems());
va1.setDisplayedChild(0);
}
});
miAdapter = new MenuItemAdapter();
miAdapter.setOnItemClickListener(new OnItemClickAdapter<MenuItem>() {
@Override
public void onItemClick(MenuItem item, int position) {
salesOrder.addMenuItem(item);
oeAdapter.notifyDataSetChanged();
updateTotals();
}
});
...
адаптеры:
public abstract class ItemRecyclerViewAdapter<T, TVH extends ItemViewHolder<T>> extends RecyclerView.Adapter<TVH> {
private ItemViewHolder.OnItemClickListener<T> listener;
protected List<T> items;
public ItemRecyclerViewAdapter() {
this(new ArrayList<T>());
}
public ItemRecyclerViewAdapter(List<T> items) {
this.items = items;
}
public final void setOnItemClickListener(ItemViewHolder.OnItemClickListener<T> listener) {
this.listener = listener;
}
public void setItems(List<T> items) {
this.items = items;
this.notifyDataSetChanged();
}
public void clear() {
this.items.clear();
this.notifyDataSetChanged();
}
protected abstract TVH createItemViewHolder(ViewGroup parent, int viewType);
@Override
public TVH onCreateViewHolder(ViewGroup parent, int viewType) {
TVH holder = createItemViewHolder(parent, viewType);
holder.setOnItemClickListener(listener);
return holder;
}
@Override
public void onBindViewHolder(TVH holder, int position) {
holder.setItem(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
}
ViewHolders:
public abstract class ItemViewHolder<T> extends RecyclerView.ViewHolder {
public ItemViewHolder(View itemView) {
super(itemView);
}
public interface OnItemClickListener<T> {
void onItemClick(T item, int position);
boolean onItemLongClick(T item, int position);
}
public final void setOnItemClickListener(final OnItemClickListener<T> listener) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null)
listener.onItemClick(getItem(), getAdapterPosition());
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
return listener != null && listener.onItemLongClick(getItem(), getAdapterPosition());
}
});
}
public abstract T getItem();
public abstract void setItem(T item);
}
Это кажется, что это проблема с подкачкой или какое-то состояние гонки, которого я не вижу, но я подумал, что увижу, может, сначала я что-то неправильно понял. Любые идеи будут высоко ценится!
1 ответ
У меня тоже есть эта ошибка. После редактирования файла Activity_main.xml я мог это исправить.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ulimbridge.recylerview.MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="0dp"
android:layout_height="0dp"
android:id="@+id/recycler"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</android.support.constraint.ConstraintLayout>
Создание RecyclerViews'высота и ширина'0dp'было решением.