在滚动之前,RecyclerView项目有时无法正确显示(仅限Genymotion平板电脑)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在滚动之前,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);

}

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

答案

我也有这个bug。编辑我的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'成为一种解决方案。

以上是关于在滚动之前,RecyclerView项目有时无法正确显示(仅限Genymotion平板电脑)的主要内容,如果未能解决你的问题,请参考以下文章

无法滚动到 NestedScrollView 内的 RecyclerView 中的项目

AdapterView 和 RecyclerView 的连续滚动

RecyclerView 自动滚动到 WebView/Fresco SimpleDraweeView 项

当滚动超出最初可见的范围时,无法访问 recyclerview 中的 textview

滚动时单击不在 CoordinatorLayout 中的 RecyclerView 上工作

向下滚动时 RecyclerView 项目之间的间隙较大