Android ListView не обновляется после вызова notifyDataSetChanged - PullRequest
2 голосов
/ 10 марта 2012

У меня есть действие, которое я запускаю следующим образом:

public class MyProblemsActivity extends ListActivity 
{
    String[] PROBLEMS = new String[] {"One", "Two", "Three" };
    ArrayAdapter adapter;       

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        adapter = new ArrayAdapter<String>(this,R.layout.my_problems, PROBLEMS);

        setListAdapter(adapter);

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

, и оно работает совершенно нормально.

Проблема, с которой я сталкиваюсь, - после вызова удаленного сервера через Asynch.звоните, делаю так:

    @Override
    protected void onPostExecute(String result) 
    {       
            PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
            adapter.notifyDataSetChanged();
        }

но экран не обновляется.Что я здесь не так делаю и как заставить экран обновляться новыми значениями?

Спасибо !!

Ответы [ 3 ]

9 голосов
/ 10 марта 2012

что происходит в

PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };

PROBLEMS получает ссылку на new объект массива строк ... Таким образом, старая ссылка остается такой, какой она есть (без изменений) ..

, чтобы исправить это, используйте следующее:

PROBLEMS.clear();
List<String> newlist = new ArrayList<String>();
newlist.add(..);
..
PROBLEMS.addAll(newlist);
adapter.notifyDataSetChanged();

таким образом, новая строка (и) будет добавлена ​​только к существующей ссылке на массив, указанной ПРОБЛЕМАМИ

ПРИМЕЧАНИЕ: я упомянулссылаясь на использование массива string вместо string [], чтобы использовать его функциональные возможности clear (), addAll (), вы можете изменить его для String [] в соответствии с вашим использованием ..

1 голос
/ 18 сентября 2013

Я читал, что вы обновили список из асинхронного обратного вызова.То же самое было и в моем случае.Я перешел к запустить его в потоке пользовательского интерфейса, и вдруг все заработало как положено! (Обычно вы получаете исключение, если не делаете этого. Здесь это просто не обновляет список.) По моемуостальные ответы - просто обходные пути.

Итак, измените ваш код следующим образом:

@Override
protected void onPostExecute(String result) 
{                  

  runOnUiThread(new Runnable() {

    @Override
    public void run() {
            PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
            adapter.notifyDataSetChanged();
    }
});
};
1 голос
/ 11 марта 2012

Если вам нужен более простой ответ, вы можете просто изменить свой код, чтобы он выглядел следующим образом:

@Override
protected void onPostExecute(String result) 
{       
    PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
    adapter.clear();
    adapter.addAll(PROBLEMS);
    adapter.notifyDataSetChanged();
}

Это изменяет содержимое ArrayAdapter, чтобы строки в вашей новой строке [], затем уведомляет ListViewчто ArrayAdapter имеет новое содержимое.Это заставит ListView обновить и показать ваши новые строки.

...