我使用Cyril Mottier编写的有用guide ListView
ViewStub
的空状态@android:id/empty
,标识为ListActivity
。在这个方法中一切都很好,但如果我setListAdapter
没有通过ListActivity
连接适配器或附加空适配器,那么我看到空视图。这一切都很清楚,但如果我想要实现这样的逻辑:
adapter
AcyncTask
Adapter
并获取AsyncTask
的数据,显示进度对话框然后从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,我希望显示带有图像的文本(例如找不到任何内容)
答案 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();
}
}