gpt4 book ai didi

android - RecyclerView 项目有时无法正确显示,直到我滚动(仅在 Genymotion 平板电脑上)

转载 作者:行者123 更新时间:2023-12-05 07:54:24 26 4
gpt4 key购买 nike

我正在开发一个简单的餐厅 POS 系统,突然遇到了一个问题。只有当我在 Genymotion 平板设备上运行它时才会出现此问题。我在较小的 genymotion 设备或我试过的 2 个物理设备上没有这个问题。

我的一个 Activity 使用 5 个 RecyclerView 来显示菜单和销售摘要。每点击几次项目,RecyclerViews 就会决定不更新并且不会正确显示我的项目,除非我在任何 RecyclerViews 上滚动一下或点击某些东西。即使它们没有正确显示,所有项目点击都会记录应该显示的内容(而不是实际显示的内容)。

例如,我点击牛肉 -> 海鲜 -> 鸡肉。负责显示菜单项的 RecyclerView 仍然显示海鲜。如果我点击任何东西,就会选择正确的鸡肉项目,所有内容都会刷新为应该显示的内容。如果我滚动任何 RecyclerView(即使是不相关的),所有内容都会正确刷新。

Activity 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);

}

它看起来像是一个交换缓冲区问题或一些我没有看到的竞争条件,但我想我会先看看我是否误解了什么。任何想法将不胜感激!

最佳答案

我也有这个问题。编辑我的 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”是一种解决方案。

关于android - RecyclerView 项目有时无法正确显示,直到我滚动(仅在 Genymotion 平板电脑上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31416371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com