notifyDataSetChanged() 没有变化/黑屏;
Posted
技术标签:
【中文标题】notifyDataSetChanged() 没有变化/黑屏;【英文标题】:no change/black screen by notifyDataSetChanged(); 【发布时间】:2012-06-29 00:46:08 【问题描述】:我想做这样的事情。
按下刷新按钮时,它会刷新列表。活动代码是这样的:
adapter = new TweetAdapter(Welcome.this, tweets, users);
tweetsList.setAdapter(adapter);
private void refreshAdapter()
adapter.clear();
adapter.refresh(tweets, users);
refreshAdapter()
在我需要更改列表项时调用。这里tweets
& users
是ArrayList
& HashMap
项目
而适配器部分是这样的:
public void clear()
this.tweets.clear();
this.users.clear();
public void refresh(ArrayList<Tweet> tweets, HashMap<String, User> users)
this.tweets.addAll(tweets);
this.users.putAll(users);
Collections.sort(this.tweets, new TweetTimeComparator());
notifyDataSetChanged();
但不幸的是,notifyDataSetChanged();
无法正常工作。通过单击刷新,列表要么变黑(最长时间),要么没有响应(一段时间)。
如果您发现错误,请告诉我或建议我该怎么做。
【问题讨论】:
【参考方案1】:我认为你正在清除数据
this.tweets.clear();
this.users.clear();
.. 我认为由于推文和用户都具有相同的引用(从活动传递到适配器),所以推文和两个用户(在适配器和活动上都指向相同的 ArrayLists)所以两者都很清楚,所以这些行都没有意义是空的
this.tweets.addAll(tweets);
this.users.putAll(users);
试试
public TweetAdapter(Context context, ArrayList<Tweet> tweets, HashMap<String, User> users)
mInflater = LayoutInflater.from(context);
this.tweets = new ArrayList<Tweet>();
this.users = new HashMap<String, User>();
this.tweets.addAll(tweets);
this.users.putAll(users);
Collections.sort(this.tweets, new TweetTimeComparator());
..
public void refresh(ArrayList<Tweet> tweets, HashMap<String, User> users)
this.tweets.clear();
this.users.clear();
this.tweets.addAll(tweets);
this.users.putAll(users);
Collections.sort(this.tweets, new TweetTimeComparator());
notifyDataSetChanged();
但是注意:现在引用两个推文(在适配器和活动上)和两个用户(在适配器和活动上)是不同的。
在其他使用 this.tweets.addAll(tweets); 的地方不应该有像 adapter.tweets = activity.tweets 这样的直接赋值;
【讨论】:
那该怎么办?? this.users.clear();不是很重要,因为我可以使用旧的用户集,但是 this.tweets.clear();对于刷新新推文很重要。public TweetAdapter(Context context, ArrayList<Tweet> tweets, HashMap<String, User> users) mInflater = LayoutInflater.from(context); this.tweets = tweets; this.users = users; Collections.sort(this.tweets, new TweetTimeComparator());
是的……你是对的。刚刚调试并发现两者都是空的:(
谢谢我的朋友,它的工作。刚刚推特并用新推文刷新了:)实际上我犯了一个基本的大错误,没有做this.tweets = new ArrayList<Tweet>();
等等......再次感谢。
嘿嘿.. 终于完成了。你无法想象我在哪里发现了这个错误,实际上它不可能远程进行。下载新推文的活动的推文价值翻倍/三倍。我只是在活动中添加新的新推文集之前添加了 tweets.clear(),然后通过 clear() 然后 refresh() 传递它。否则一切正常。适配器中的 clear() 正在工作,我已经感谢你 this.tweets=new ArrayList以上是关于notifyDataSetChanged() 没有变化/黑屏;的主要内容,如果未能解决你的问题,请参考以下文章
在 notifyDataSetChanged 之后 FragmentStateAdapter 没有重新创建 currentFragment
在没有 notifyDataSetChanged 的情况下刷新列表?
RecyclerView 在 NotifyDataSetChanged() 之后没有更新,打开和关闭屏幕后显示内容
Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因
自定义 listView 数组,搜索,在 NotifyDataSetChanged 上崩溃,加上 listView 没有得到更新