片段中的 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() 不工作]