В основном процесс выглядит следующим образом: когда создается фрагмент (или когда пользователь проводит пальцем, чтобы обновить макет), выполняется AsyncTask. ASyncTask извлекает информацию из URL-адреса и настраивает адаптер, который затем назначается ListView.
Это код Фрагмента:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tasks_page, container, false);
mSwipeRefreshLayout = (SwipeRefreshLayout)
rootView.findViewById(R.id.list_container);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light, android.R.color.holo_red_light);
lv = (ListView) rootView.findViewById(android.R.id.list);
getTasks();
return rootView;
}
private void getTasks() {
new TasksRetriever(mSwipeRefreshLayout,tasksAdapter,lv).execute();
}
@Override
public void onRefresh() {
mSwipeRefreshLayout.setRefreshing(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getTasks();
}
}, 1000);
}
Конструктор TaskRetriever:
public TasksRetriever(SwipeRefreshLayout srl, TasksAdapter ta, ListView lv) {
adpt = ta;
this.srl = srl;
this.lv = lv;
}
и postExecute:
@Override
protected void onPostExecute(List<TasksItem> result) {
super.onPostExecute(result);
dialog.dismiss();
if (adpt == null) adpt = new TasksAdapter(result);
else adpt.setItemList(result);
lv.setAdapter(adpt);
adpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
Пока не уверен, работает ли это, но мне было интересно, на правильном ли я пути, потому что мне это не кажется чистым. С другой стороны, я не могу создать адаптер и назначить его для ListView, пока у меня действительно не будет данных для него... Это нормально или я делаю это неправильно?