Android - 为列表视图填充适配器的异步任务
Android - asynctask that fills an adapter for a listview
基本上流程如下:创建片段时(或当用户滑动刷新布局时),执行 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,直到我真正拥有它的数据...这是考虑好还是我做错了?
您可以创建一个空适配器并稍后填充它 - 在 AsyncTask 中
您的 onPostExecute()
应如下所示:
@Override
protected void onPostExecute(List<TasksItem> result) {
dialog.dismiss();
if (adpt == null){
adpt = new TasksAdapter(result);
lv.setAdapter(adpt);
}else{
adpt.clear();
}
for( TaskItem ti : result ) adpt.add( ti );
adpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
我会在列表视图下的 onCreate() 方法中设置列表适配器,并将其设为实例变量(不是本地变量),以便异步任务可以按如下方式访问它,即
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
lv = (ListView) rootView.findViewById(android.R.id.list);
mAdpt = new TasksAdapter(null);
lv.setAdapter(mAdpt);
}
然后在你的 onPostExecute()
@Override
protected void onPostExecute(List<TasksItem> result) {
dialog.dismiss();
mAdpt.clear();
for( TaskItem ti : result )
{
mAdpt.add( ti );
}
mAdpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
还要确保考虑到在 getView() 方法中传递到适配器的空值。
希望对您有所帮助。
基本上流程如下:创建片段时(或当用户滑动刷新布局时),执行 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,直到我真正拥有它的数据...这是考虑好还是我做错了?
您可以创建一个空适配器并稍后填充它 - 在 AsyncTask 中
您的 onPostExecute()
应如下所示:
@Override
protected void onPostExecute(List<TasksItem> result) {
dialog.dismiss();
if (adpt == null){
adpt = new TasksAdapter(result);
lv.setAdapter(adpt);
}else{
adpt.clear();
}
for( TaskItem ti : result ) adpt.add( ti );
adpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
我会在列表视图下的 onCreate() 方法中设置列表适配器,并将其设为实例变量(不是本地变量),以便异步任务可以按如下方式访问它,即
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
lv = (ListView) rootView.findViewById(android.R.id.list);
mAdpt = new TasksAdapter(null);
lv.setAdapter(mAdpt);
}
然后在你的 onPostExecute()
@Override
protected void onPostExecute(List<TasksItem> result) {
dialog.dismiss();
mAdpt.clear();
for( TaskItem ti : result )
{
mAdpt.add( ti );
}
mAdpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
还要确保考虑到在 getView() 方法中传递到适配器的空值。
希望对您有所帮助。