Как сбросить ListView с помощью ArrayAdapter после получения данных - PullRequest
6 голосов
/ 10 марта 2012

Я использую ListAdapter для заполнения ListView следующим образом:

static final String[] PROBLEMS = new String[] {"one", "two", "three" };

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

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

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

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

    @Override
    protected void onPostExecute(String result) 
    {       
            // Unwrap the stuff from the JSON string                
            String problem_title = null;
            String problem_id = null;

            try
            {
                JSONArray obj = new JSONArray(result);
                JSONObject o = obj.getJSONObject(0);                    

                Log.d( "Title: " , "" + o.getString("problem_title") );       
                Log.d( "id: " , "" + o.getString("problem_id") );      

                problem_title = o.getString("problem_title");
                problem_id = o.getString("problem_id");
            }
            catch ( Exception e )
            {
            }

            // Now not sure what to do :)
            // How do I reset the list that I had set up above?
                }

Я могу преобразовать результат в правильно структурированные данные для сброса списка, но не уверен, как это сделать. Может кто-нибудь, пожалуйста, помогите? :)

Ответы [ 3 ]

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

Я использую это так,

    values = new ArrayList<String>();
    //put anything you want in values as start
    adapter = new ArrayAdapter<String>(this,R.layout.notification, values);
    setListAdapter(adapter);

тогда

    //change values array with your new data then update the adapter
    adapter.notifyDataSetChanged();

тогда содержимое списка будет меняться во время выполнения этой функции

7 голосов
/ 24 июля 2014

Вам не нужно повторно инициализировать адаптер, если вы просто хотите изменить набор данных.Попробуйте следующий код -

adapter.clear();
for(int i = 0;i<categoriesArray.length;i++){
    adapter.add(categoriesArray[i]);
} 

, после этого при необходимости вы также можете уведомить об изменении адаптера, хотя в этом нет необходимости.целевой API уровня 11 или выше, вы можете использовать метод addAll () на адаптере.Так как это более эффективно.

adapter.clear();
adapter.addAll(categoriesArray);
3 голосов
/ 10 марта 2012
adapter.notifyDataSetChanged();

хороший вариант для этого, но иногда это не работает так, как нам нужно. В этом случае вы можете снова установить setadapter, и ваш список обновится. Но это не очень хороший вариант, потому что он снова генерирует весь просмотр списка, так что это сильно снижает производительность. И ваше приложение работает медленно.

...