处理空列表和asynctask

时间:2011-11-28 18:02:51

标签: android listview

我使用Cyril Mottier编写的有用guide ListView ViewStub的空状态@android:id/empty,标识为ListActivity。在这个方法中一切都很好,但如果我setListAdapter没有通过ListActivity连接适配器或附加空适配器,那么我看到空视图。这一切都很清楚,但如果我想要实现这样的逻辑:

  1. 打开adapter
  2. 附加AcyncTask
  3. 执行Adapter并获取AsyncTask的数据,显示进度对话框
  4. 调用notifyDataSetChanged
  5. 关闭对话框
  6. 然后从1到3步,我看起来有错误的空视图(例如“未找到”)。但是我想在执行AsyncTask之后才显示错误。在执行期间@android:id/empty我希望只显示进程对话框。我尝试使用include的使用可见性选项,尝试在xml中使用activity.xml。但无法实现这一逻辑。任何建议都会表示赞赏。

    UPD :更多信息 我有<FrameLayout android:id="@id/gd_action_bar_content_view" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <ListView android:id="@android:id/list" style="@style/listViewStyle" android:layout_width="fill_parent" android:layout_height="fill_parent" android:focusable="false" /> <ViewStub android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="fill_parent" layout="@layout/error" /> </FrameLayout>

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:padding="20dp">
    
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="centerInside"
        android:src="@drawable/ic_cheese" />
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:textStyle="bold"
        android:textSize="16sp"
        android:text="@string/no_cheese" />
    </LinearLayout>
    

    error.xml:

    public class MyListActivity extends ListActivity implements OnScrollListener, OnItemClickListener{
    @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity); //inflate activity with ViewStub
        mAdapter = new MyAdapter(this, Collections.EMPTY_LIST); 
        setListAdapter(mAdapter);
        new SearchAndFill().execute("");
        }
    }
    

    ListActivity类:

    private class SearchAndFill extends AsyncTask<String, Void, List<Object>>{
        LoadingDialog dialog;
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if (dialog==null){
                dialog = new LoadingDialog(MyListActivity.this);
                dialog.setCancelable(false);
            }
            dialog.show();
        }
    
        @Override
        protected List<Object> doInBackground(String... str) {
            return search(str[0]); //this is HTTP GET request
        }
    
        @Override
        protected void onPostExecute(List<Object> result) {
            super.onPostExecute(result);
            dialog.dismiss();
            showResult(result); //this is fill adapter data and call notifyDataSetChanged
        }
    }
    

    Async class:

    activity.xml

    当活动创建并膨胀AsyncTask时,它显示为空,然后执行AsyncTask,而执行onPostExecute时,我会看到空视图。当调用AsyncTask activity.xml方法时,我会看到HTTP GET请求的结果。当活动创建并膨胀AsyncTask时,它显示为空,然后执行AsyncTask,而执行onPostExecute时,我会看到空视图。当调用AsyncTask {{1}}方法时,我会看到HTTP GET请求的结果。我认为这是错的。我希望在执行AsyncTask之前显示空白ListView,如果结果等于Collections.EMPTY_LIST,我希望显示带有图像的文本(例如找不到任何内容)

2 个答案:

答案 0 :(得分:0)

我建议您尝试将空视图的文本值设置为空字符串(""),然后在AsyncTask完成时将文本值更改为错误消息。

希望它能解决你的问题。

答案 1 :(得分:0)

据我所知,这是你想要实现的目标......

public class MyListActivity extends ListActivity implements OnScrollListener, OnItemClickListener{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity); //inflate activity with ViewStub
        ((ViewStub) findViewById(R.id.YOUR_VIEW_STUB_ID)).setVisibility(View.GONE);
        mAdapter = new MyAdapter(this, Collections.EMPTY_LIST); 
        setListAdapter(mAdapter);
        new SearchAndFill().execute("");
    }
}

...    ...    ....

private class SearchAndFill extends AsyncTask<String, Void, List<Object>>{
LoadingDialog dialog;

@Override
protected void onPreExecute() {
    super.onPreExecute();
    if (dialog==null){
        dialog = new LoadingDialog(MyListActivity.this);
        dialog.setCancelable(false);
    }
    dialog.show();
}

@Override
protected List<Object> doInBackground(String... str) {
    return search(str[0]); //this is HTTP GET request
}

@Override
protected void onPostExecute(List<Object> result) {
    super.onPostExecute(result);
    if (result == null || result.size() == 0){
        mAdapter.notifyDataSetInvalidated();
        ((ViewStub) findViewById(R.id.YOUR_VIEW_STUB_ID)).setVisibility(View.VISIBLE);
    } else {
        // add stuff to mAdapter here...
        mAdapter.notifyDataSetChanged();
    }
    dialog.dismiss();
}

}