notifyDataSetChanged()无变化/黑屏;

时间:2012-06-27 14:37:33

标签: android listview adapter baseadapter

我想做这样的事情。

按下刷新按钮时,它将刷新列表。活动代码如下:

        adapter = new TweetAdapter(Welcome.this, tweets, users);
        tweetsList.setAdapter(adapter);


    private void refreshAdapter() {
        adapter.clear();
        adapter.refresh(tweets, users);
    }
当我需要更改列表项时,

refreshAdapter()被调用。这里tweets& usersArrayList& 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 个答案:

答案 0 :(得分: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();
}

但请注意:现在引用两条推文(在适配器和活动上),两个用户(在适配器和活动上)都不同。

不应该像adapter.tweets = activity.tweets那样直接赋值任何其他地方使用this.tweets.addAll(tweets);