Я пытаюсь использовать 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.
Это мое приложение должно работать:
- Приложение создает пустой адаптер. Это будет отображать «Загрузка ...» TextView
- приложение создает новую задачу Async, которая будет извлекать некоторые необходимые данные с моего сервера
- После завершения задачи асинхронным, он будет вызывать .updateTerminals метод ()
- Этот метод обновления записей из пользовательского адаптера и вызвать notifyDataSetChanged()
- приложение должно отобразиться в ListView с недавно полученными данными
Я попытался выяснить, что не так с моим кодом, но я не смог. Я хотел бы услышать ваши предложения/решения! Благодаря !
PS: Скажите, если вам нужно что-нибудь, чтобы лучше понять мою проблему.
| Удалить 'TerminalsArrayAdapter адаптер = новый TerminalsArrayAdapter (это); // Пользовательский адаптер setListAdapter (адаптер); 'fom onCreate и поместить его в onPostExecute. Добавьте объекты непосредственно в onPostExecute. Удалите 'mAdapter.updateTerminals (response)' из onPost | EExecute. – greenapps
попробуйте использовать метод invalidate в виде списка –
Смотрите это: http://stackoverflow.com/questions/5186359/donenotifydatasetchanged-does-not-update-listactivity-automatically –