0


Я пытаюсь использовать ListActivity в своем приложении для Android, но он не работает так, как должен.
Вот моя активность:
Почему мой ListActivity застрял на/пустом элементе?

public class MainActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_terminals_list); //The special layout 

     TerminalsArrayAdapter adapter = new TerminalsArrayAdapter(this); // A custom adapter 
     setListAdapter(adapter); 
     RequestTask task = new RequestTask(adapter); // An Async task 
     task.execute("/terminals/all"); 
    } 
} 

Вот мой макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

    <TextView 
     android:id="@android:id/empty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Loading..." /> 
</LinearLayout> 

Вот мой заказ адаптер:

public class TerminalsArrayAdapter extends ArrayAdapter<String[]> { 

    private Activity mContext; 
    private ArrayList<String[]> mObjects = new ArrayList<String[]>(); 

    public TerminalsArrayAdapter(Activity context) { 
     super(context, R.layout.terminals_listview_item); 
     this.mContext = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View elementView; 

     if(convertView==null){ 
      LayoutInflater inflater = mContext.getLayoutInflater(); 
      elementView = inflater.inflate(R.layout.terminals_listview_item, parent); 
      ... 
      // Some things with my view 

     } else { 
      elementView = convertView; 
     } 

     ... 
     // Some things with my view 
     return elementView; 
    } 

    public void updateTerminals(ArrayList<String[]> newObject){ 
     mObjects.clear(); 
     mObjects.addAll(newObject); 
     notifyDataSetChanged(); 
     Log.d("TerminalsArrayAdapter", "Dataset Changed !"); 
    } 
} 

А вот моя Асинхронный задача:

public class RequestTask extends AsyncTask<String, Void, ArrayList<String[]>>{ 

    private final TerminalsArrayAdapter mAdapter; 

    public RequestTask(TerminalsArrayAdapter adapter) { 
     mAdapter = adapter; 
    } 

    @Override 
    protected ArrayList<String[]> doInBackground(String... params) { 

     ... 
     // retrieve some data from my server 
     return response; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<String[]> response) { 
     Log.d("response_server","GOT IT !"); 
     mAdapter.updateTerminals(response); 
    } 
} 


Как я понял, ListView будет показан только в том случае, если адаптер не пуст. Если он пуст, будет отображаться TextView.

Это мое приложение должно работать:

  1. Приложение создает пустой адаптер. Это будет отображать «Загрузка ...» TextView
  2. приложение создает новую задачу Async, которая будет извлекать некоторые необходимые данные с моего сервера
  3. После завершения задачи асинхронным, он будет вызывать .updateTerminals метод
  4. ()
  5. Этот метод обновления записей из пользовательского адаптера и вызвать notifyDataSetChanged()
  6. приложение должно отобразиться в ListView с недавно полученными данными
шаги с 1 по 4 работают нормально. Проблема возникает на шаге 5: даже если данные были обновлены, мое приложение не обновляет экран, чтобы показать мне ListView и остается в TextView «Загрузка ...».

Я попытался выяснить, что не так с моим кодом, но я не смог. Я хотел бы услышать ваши предложения/решения! Благодаря !

PS: Скажите, если вам нужно что-нибудь, чтобы лучше понять мою проблему.

+0

| Удалить 'TerminalsArrayAdapter адаптер = новый TerminalsArrayAdapter (это); // Пользовательский адаптер setListAdapter (адаптер); 'fom onCreate и поместить его в onPostExecute. Добавьте объекты непосредственно в onPostExecute. Удалите 'mAdapter.updateTerminals (response)' из onPost | EExecute. – greenapps

+0

попробуйте использовать метод invalidate в виде списка –

+0

Смотрите это: http://stackoverflow.com/questions/5186359/donenotifydatasetchanged-does-not-update-listactivity-automatically –

ответ

0

Ваш ListView высота должна быть match_parent.

Попробуйте поиграть с setVisibility(View.GONE) и setVisibility(View.VISIBLE) к:

  • шоу TextView & скрыть ListView
  • показать ListView & скрыть TextView
0
public class MainActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_terminals_list); //The special layout 
     // create your list with specific method to be able call her many time 
     // prefer to create then refresh with new data 
     CreateList(Passanydata); 
     RequestTask task = new RequestTask(adapter); // An Async task 
      task.execute("/terminals/all"); 

    } 
} 

public void CreateList(ArrayList<String[]> response){ 
TerminalsArrayAdapter adapter = new TerminalsArrayAdapter(this,response); // A custom adapter 
      setListAdapter(adapter); 

} 



@Override 
    protected void onPostExecute(ArrayList<String[]> response) { 
     Log.d("response_server","GOT IT !"); 
     // after you got your new data , pass it to your list 
     CreateList(response); 
    } 




public class TerminalsArrayAdapter extends ArrayAdapter<String[]> { 

    private Activity mContext; 
    private ArrayList<String[]> mObjects = new ArrayList<String[]>(); 

    public TerminalsArrayAdapter(Activity context,ArrayList<String[]> objects) { 
     super(context, R.layout.terminals_listview_item); 
     this.mContext = context; 
     // when you have your data it will be able to use it here 
     this.mObjects = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View elementView; 

     if(convertView==null){ 
      LayoutInflater inflater = mContext.getLayoutInflater(); 
      elementView = inflater.inflate(R.layout.terminals_listview_item, parent); 
      ... 
      // Some things with my view 

     } else { 
      elementView = convertView; 
     } 

     ... 
     // Some things with my view 
     return elementView; 
    } 


} 
+0

Привет! Где вы определяете CreateList? В отдельном файле? Если да, то какой тип файла? – Sek8

+0

CrateeList - метод в MainActivity –

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