【问题标题】:Is there any way to update the appearance of one RecyclerView element without a full reload?有没有办法在不完全重新加载的情况下更新一个 RecyclerView 元素的外观?
【发布时间】:2016-10-07 08:32:44
【问题描述】:

我正在制作一个应用程序,它的主要 RecyclerView “提要”由帖子元素组成。

您可以点击帖子,进入详细视图。

我选择将详细视图放在“透明”活动中,这样当单击详细视图时,当前活动会暂停并开始新活动。这意味着提要活动不会丢失其状态,并且recyclerview 会保持其位置,因此当用户单击返回时,活动/片段不需要重新加载。

在提要的帖子和详细视图上,我都有可以点击的拇指按钮。当用户进入详细视图时,我传入拇指按钮的状态,并在 onCreate() 中对其进行初始化。当用户退出详细视图时,我需要更新主提要中拇指按钮的状态(以保持它们同步)而不刷新整个回收器视图。 这需要我在 recyclerview 的一项中刷新数据集(并随后更新外观),而无需刷新/重新加载整个 recyclerview。这可能吗?

我尝试通过更新适配器使用的数据集并调用 notifyItemChanged(position) 来执行此操作,但这不起作用。有人告诉我这个方法调用 onBindViewHolder(然后它会调用我的绑定方法并更新视图)。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Here, I'm updating my mRecipes data set after returning from the detailed view

    if (requestCode == 0) {
        int adaptpos = Integer.parseInt(data.getStringExtra("adaptpos"));
        String likes = data.getStringExtra("likes");
        String favorites = data.getStringExtra("favorites");
        mRecipes[adaptpos].setLikes(likes);
        mRecipes[adaptpos].setFavorites(favorites);
        mAdapter.notifyDataSetChanged();
        mAdapter.notifyItemChanged(adaptpos);

    }
}

对此的任何帮助将不胜感激。如果一切都失败了,我可能只需要重新加载整个片段以反映状态的变化。

【问题讨论】:

    标签: android android-fragments android-intent android-activity android-recyclerview


    【解决方案1】:

    您可以使用DiffUtil 来处理这种情况,这是一种处理回收站视图项目更新的简单方法,最近已添加到支持库中。

    这篇medium 帖子解释了实现

    【讨论】:

    • 感谢您的回答,我正在检查。
    • 不,DiffUtil 更新整个列表,您可以使用它来代替 notifyDataSetChanged(),它会很棒,但是对于一个项目,建议使用 notifyItemChanged(),而 DiffUtil 它有有效载荷和不推荐单品
    • 是的,如果它只是一个元素,您可以使用以下方法之一,具体取决于它是否已删除/更改/添加 - notifyItemChanged(int) - notifyItemInserted(int) - notifyItemRemoved(int) - notifyItemRangeChanged(int , int) - notifyItemRangeInserted(int, int) - notifyItemRangeRemoved(int, int)
    猜你喜欢
    • 2016-05-07
    • 2014-02-23
    • 2020-01-06
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多