2013-02-18 2 views
0

У меня есть одно действие, но 3 макета. ListView является частью макета, который отображается после входа в систему. Вот почему я не могу установить ArrayAdapter onCreate, поскольку мой ListView еще не инициализирован. Я пробовал следующий this учебник, но я не смог воспроизвести эти шаги. В этом учебнике автор сделал все, что угодно.Android Добавление элементов ListView из массива JSON

Я пытался делать это так:

ArrayList<String> listItems=new ArrayList<String>(); 
ArrayAdapter<String> adapter; 

... 

    public class getcontacts extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected Boolean doInBackground(Void... params) { 

...HERE I AM FETCHING DATA... 

listItems.add(json_data.getString("login") + " " + derp); 
} 

@Override 
    protected void onPostExecute(final Boolean success) { 
     getc = null; 


     ac = new addcontacts(); 
     ac.execute(true); 

А вот код addcontacts класса:

public class addcontacts extends ListActivity { 


    protected void onCreate() { 


     adapter=new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, 
        listItems); 
     setListAdapter(adapter); 

     adapter.notifyDataSetChanged(); 

    } 
    protected void execute(final Boolean success) { 

    done = true; 
    } 


} 

И расположение:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 



<TextView 
    android:id="@+id/textView1" 
    android:layout_width="match_parent" 
    android:layout_height="188dp" 
    android:layout_weight="0.53" 
    android:text="Fetching contact list" /> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="106dp" > 
</ListView> 

</LinearLayout> 

ListView не содержит что-нибудь. Я проверил в отладчике, что listItems имеет все элементы, поэтому с адаптером что-то не так.

+0

Вы не создаете действия через явный Контрактор, как вы это делали. Вы также должны обратить внимание на то, что вы пишете, 'onCreate()' должен получить Bundle в качестве аргумента. Используйте аннотации '@ Override', это упростится. Кроме того, используйте правильные соглашения об именах и покажите нам, как настроен каждый класс. Если и AsyncTask, и ListActivity являются частью одного и того же файла, не разделяйте их. –

+0

Вот полный код: http://pastebin.com/dA6dcZRv – Disa

ответ

1

Я предлагаю свой следующий подход:

  1. В Activity класс ListView и инициализировать Adapter с пустым списком.
  2. Создайте подкласс BaseAdapter, чтобы получить больше контроля над ним.
  3. Проход Adapter и список через конструктор Adapter.
  4. Провод Adapter и List в вашем подклассе AsyncTask.
  5. В вашем методе doInBackground() выполнить выборку данных с сервера и добавить каждый элемент в List.
  6. Если вы хотите создать Ленивый-адаптер поэтому каждый элемент добавлен в List, вызовите publishProgress() и onProgressUpdate() вызова метода yourAdapter.notifyDataSetChanged().
  7. Если нет, после завершения работ, в onPostExecute() метод call yourAdapter.notifyDataSetChanged().
  8. Теперь он должен работать.

Все готово.

+0

Не могли бы вы привести пример кода? – Disa

+0

Вот очень похожий пример ['Custom Custom ListView для Android с изображением и текстом'] (http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/), где данные анализируется из XML и динамически добавляется в список с обновлением. – Sajmon

+0

Кажется сложным. Есть ли еще более простой способ? – Disa

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