如何在RecyclerView中的notifyDataSetChanged时更新指定的项目

时间:2016-07-29 08:53:02

标签: android android-recyclerview notifydatasetchanged

我在RecyclerView中有一个项目,在我致电notifyDataSetChanged时无需更新。

但是我没有找到任何方法来使指定的项目避免更新。有可能这样做吗?

我需要这样做是因为该项目是WebView,它已经加载了一个html页面,如果我调用了notifyDataSetChanged,这个项目就会闪现。

我发布此问题的原因是在WebView时避免notifyDataSetChanged的闪现(请参阅this quesion)。在使用notifyItemRangeXXX方法失败后,我发布了这个问题。

但是在检查了你的答案和评论后,似乎在使用notifyDataSetChanged时无法避免更新。

3 个答案:

答案 0 :(得分:3)

notifyItemChanged(int position) notifyItemInserted(int position) notifyItemMoved(int fromPosition, int toPosition) notifyItemRangeChanged(int positionStart, int itemCount) notifyItemRangeRemoved(int positionStart, int itemCount) notifyItemRemoved(int position) IS的目的是更新所有项目。如果你不想要这种行为,请不要使用它!

正确的方法是仅更新您已更改的数据。有一些方法可以帮助您只使所需数据无效:

<?php

namespace My\MiddlewareBundle\Controller;

use FOS\RestBundle\Controller\FOSRestController;


class ExportController extends FOSRestController
{

    public function indexAction($exportId)
    {
        $result = exportSomeThingSpecial($exportId);
        return $this->handleView($this->view(['test' => 'bla'], ($result) ? 201 : 500));
    }
}

答案 1 :(得分:2)

是的,它实际上可以这样做。 notifyDataSetChanged()通知RecyclerView 数据集中的所有元素都已更改

由于您不希望这种情况发生并排除特定项目。

for(int i = 0; i< mAdapter.getItemCount(); i++){
    if(i != itemPositionToExclude){
       mAdapter.notifyItemChanged(i);
    }
}

因此,我们需要遍历适配器中的所有元素,并仅针对那些位置notifyItemChanged()调用which you do not want to exclude

答案 2 :(得分:1)

您应该以不同的方式思考 - 需要更新哪些项目。要更新项目的UI,请在更改数据后使用方法notifyitemchanged