片段中的 notifyDataSetChanged() 不刷新列表视图

Posted

技术标签:

【中文标题】片段中的 notifyDataSetChanged() 不刷新列表视图【英文标题】:notifyDataSetChanged() in Fragment is not refreshing listview 【发布时间】:2013-12-27 23:17:26 【问题描述】:

我正在尝试显示从 url 获取的项目列表,但我只想一次获取 20 个项目...所以我实现了一个 OnScrollListener 以在用户最后一次获取项目时获取项目列表视图的项目。

项目已获取,但我唯一的问题是列表视图未更新:这是我目前的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    parentView = inflater.inflate(R.layout.activity_event_speakers_alphabetically, container,false);
    listView = (ListView) parentView
            .findViewById(R.id.speakersAlphabeticallyActivityList);
    nameOrderedMembers.addDataBatch(communityMembers);
    nameOrderedAdapter = DelegateViewStateAdapterFactory
            .makeUserListAdapter(getActivity(),
                    nameOrderedMembers.getSortedData(), DelegateViewStateAdapterFactory.OrderType.NAME);
    listView.setAdapter(nameOrderedAdapter);
    AQuery aQuery = new AQuery(listView);
    aQuery.id(R.id.speakersAlphabeticallyActivityList).scrolled(new EndlessScrollListener());
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                long arg3) 
            if (nameOrderedAdapter.getItem(arg2) instanceof User) 
                User u = (User) nameOrderedAdapter.getItem(arg2);
                Intent i = new Intent(getActivity(),
                        UserProfileFragmentActivity.class);
                startActivity(i);
            
        
    );

    return parentView;

现在 - 在 onPostExecute 方法的 AsynkTask 中 - 我这样通知适配器:

communityMembers.addAll(newMembers);
getActivity().runOnUiThread(new Runnable() 
    @Override
    public void run() 
    nameOrderedAdapter.addAll(communityMembers);
    nameOrderedAdapter.notifyDataSetChanged();
    
  );

但列表视图不会刷新 - 只有当我返回并重新打开活动时 - 才会显示新数据。

那么如何通知适配器有新数据要显示呢?

【问题讨论】:

看起来不错。试试listView.invalidateViews(); 不——我试图将 listView.invalidateViews() 放在 notifyDataSetChanged() 之后——但 listview 保持不变! 我也遇到了同样的问题,但没有得到解决方案。如果我返回并重新打开它正在更新的活动,Listview 不会刷新 ind。我也尝试过 listView.invalidateViews();但与 Alin 相同,不是列表视图没有更新... nameOrderedAdapter.addAll(communityMembers); nameOrderedAdapter.notifyDataSetChanged(); listView.invalidateViews(); addAll 是否将数据添加到 Adapter 中的同一个 Collection 对象中?我在创建新的 Collection 实例时遇到了问题。 【参考方案1】:

notifyDataSetChanged()之后调用listView.invalidateViews()

【讨论】:

不走运 - 我试过了,但列表视图没有刷新新项目! 您不必在方法 OnPostExecute 中调用 runOnUiThread,因为该方法已经在 UI 线程中运行。 如果不刷新数据,则检查数据是否改变 据我所知 - 有新项目要显示 - 因为每次运行 asynktask 时成员列表的大小都会增加【参考方案2】:

nameOrderedAdapter.notifyDataSetChanged(); 之后添加以下行:

listView.setAdapter(nameOrderedAdapter);

【讨论】:

我正在使用RecyclerView,这是经过数小时的试验和搜索后唯一对我有用的解决方案!【参考方案3】:

使用

notifyDataSetInvalidated()

方法 如果您使用任何自定义 ListView 或自定义 GridView,例如 / 水平列表视图

【讨论】:

以上是关于片段中的 notifyDataSetChanged() 不刷新列表视图的主要内容,如果未能解决你的问题,请参考以下文章

ArrayAdapter.NotifyDataSetChanged() 不工作?

刷新 ArrayAdapter onResume [notifyDataSetChanged() 不工作]

notifyDataSetChanged 不适用于 RecyclerView

从片段更新ListView适配器内的TextView

在tablayout中替换片段

片段不刷新其内容