2012-06-27 3 views
0

Я хочу сделать что-то вроде этого.без изменений/черный экран by notifyDataSetChanged();

при нажатии обновить кнопка, она обновит список. Активность коды, как это:

 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(); 

.. Я думаю, как твиты и пользователи и имеют то же refreance (как это передается от активности к адаптеру), так как твиты и оба пользователей (на адаптере и деятельность указывают на те же 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);

+0

поэтому, что делать ?? this.users.clear(); не слишком важно, потому что я могу использовать старые пользовательские наборы, но this.tweets.clear(); важно для обновления новых твитов. –

+0

первые хотят видеть конструктор на адаптере, чтобы подтвердить все ... –

+0

'общественного TweetAdapter (контекст Context, ArrayList твиты, \t \t \t HashMap пользователи) { \t \t mInflater = LayoutInflater.from (контекст); \t \t this.tweets = tweets; \t \t this.users = пользователи; \t \t Collections.sort (this.tweets, new TweetTimeComparator()); \t} ' –

Смежные вопросы