当前位置: 首页 > 知识库问答 >
问题:

回收器视图不能流畅地滚动

贲绪
2023-03-14

我的活动中有一个片段,其结构如下:

<android.support.v7.widget.RecyclerView android:id="@+id/cafeRecyclerView"
                                    xmlns:android="http://schemas.android.com/apk/res/android"
                                    android:layout_width="match_parent"
                                    android:layout_height="match_parent"/>

它只有一个回收视图。它有一个适配器,其代码如下:

public class InfinityFragmentRecyclerAdapter extends RecyclerView.Adapter       implements HasDatabase
{
protected JsonDatabase jsonDatabase = new JsonDatabase();
protected Context mContext;
protected int arrangeMode;

public InfinityFragmentRecyclerAdapter(Context context, int viewMode)
{
    mContext = context;
    arrangeMode = viewMode;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
    View view;
    if (arrangeMode == SupportsGridAndListArrangement.GRID_VIEW)
    {
        view = LayoutInflater.from(viewGroup.getContext()).inflate
                (R.layout.grid_advertisement_layout, null);
    }
    else
    {
        view = LayoutInflater.from(viewGroup.getContext()).inflate
                (R.layout.list_advertisement_layout, null);
    }
    return new ItemHolder(view, mContext, arrangeMode);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i)
{
    AdItemPassiveDataSet adItemPassiveDataSet = (AdItemPassiveDataSet) jsonDatabase.getDataSetAt(i);

    Picasso.with(mContext).load(adItemPassiveDataSet.getItemThumbnailAddress()).into
            (((ItemHolder) viewHolder).imageView);
    ((ItemHolder) viewHolder).adID = adItemPassiveDataSet.getItemID();
    ((ItemHolder) viewHolder).userID = adItemPassiveDataSet.getUserID();
    ((ItemHolder) viewHolder).userRole = adItemPassiveDataSet.getUserRole();
    ((ItemHolder) viewHolder).price.setText(adItemPassiveDataSet.getItemPrice(), false);
    ((ItemHolder) viewHolder).title.setText(adItemPassiveDataSet.getItemTitle(), false);
    ((ItemHolder) viewHolder).state.setText(adItemPassiveDataSet.getItemState(), false);
    ((ItemHolder) viewHolder).date.setText(adItemPassiveDataSet.getItemTime(), false);

    if (arrangeMode == SupportsGridAndListArrangement.LIST_VIEW)
    {
        ((ItemHolder) viewHolder).description.setText(adItemPassiveDataSet.getItemDescription());

        StaggeredGridLayoutManager.LayoutParams layoutParams =
                new StaggeredGridLayoutManager.LayoutParams
                        (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutParams.setFullSpan(true);
        viewHolder.itemView.setLayoutParams(layoutParams);
    }
}

@Override
public int getItemCount()
{
    if (jsonDatabase != null)
    {
        return jsonDatabase.getCount();
    }
    else
    {
        return 0;
    }
}

@Override
public JsonDatabase getDatabase()
{
    return jsonDatabase;
}

public void append(Object newJsonDatabase)
{
    int currentCount = 0;
    if (jsonDatabase != null)
    {
        currentCount = jsonDatabase.getCount();
    }
    int newCount = ((JsonDatabase) newJsonDatabase).getCount();
    jsonDatabase.appendAtEnd((JsonDatabase) newJsonDatabase);
    for (int i = currentCount; i < (currentCount + newCount); i++)
    {
        notifyItemInserted(i);
    }
}
}

我还以这种方式设置我的片段:

        recyclerView = (RecyclerView) findViewById(R.id.cafeRecyclerView);
    recyclerViewAdapter = new InfinityFragmentRecyclerAdapter(this, SupportsGridAndListArrangement.GRID_VIEW);
    StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(staggeredGridLayoutManager);
    recyclerView.setAdapter(recyclerViewAdapter);

每次我从服务器接收到新数据时,我都会通过以下方式将它们添加到cardwiews中的RecyclerView:

recyclerViewAdapter.append(newJsonDatabase);

每件事都很好!我可以下载数据,将它们添加到回收者视图等等,但问题是回收者视图不流畅滚动。我真的很困惑。有什么想法吗?任何帮助将不胜感激。

共有1个答案

尉迟冯浩
2023-03-14

尝试使用notifyItemRangeInserted()而不是notifyItemInserted()

如果我理解正确,您的代码应该是这样的

notifyItemInserted(currentCount, currentCount + newCount);
 类似资料:
  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个:

  • 我在我的活动中实现了一个视图寻呼机,在滚动时,将一组数据加载到适配器并将它们显示在列表视图中。一切正常,但我似乎无法找出如何使其更有效,因为滚动时,视图会冻结,但例如在GMAIL应用程序中,当在电子邮件之间滚动时,滚动是如此平滑。 下面是我正在使用的代码: 活动: 创建时 页面适配器: PagechAngelistener:

  • 我正在使用下面的代码创建一个回收器视图。recyclerview有一个网格布局管理器,其项计数最多为每行2个。 不幸的是,我嵌套在ConstraintLayout中的回收器视图根本没有滚动。我错过了什么?约束布局是否支持相同的?

  • 我刚开始在firebase工作。我设法上传了文本和图像,但是,我无法检索要显示在回收器视图中的图像,只能检索文本。我用的是毕加索依赖。我已经包括了我的主要活动。java类,该类负责显示从问题“我的适配器”中的firebase检索的回收器视图项。java类和模型类。我相信,在我将图像URI上载到firebase存储时,我可能犯了没有存储图像URI的错误,因此适配器无法检索图像位置。我想这可能是因为我

  • 我在嵌套滚动视图中有一个回收器视图。当回收器视图中有太多数据时,滚动会滞后。除了将回收器视图从嵌套滚动视图中删除之外,还有什么方法可以解决这个问题吗?

  • 我有一个动态填充的RecyclerView。 当新消息到达时,我使用此代码向下滚动到最后一个条目: 现在的问题是:如果用户已经向上滚动阅读旧消息,它不应该向下滚动。怎么才能检测出来?