我想在我的Listview中显示一个Button,以防我没有数据通过自定义数组适配器填充列表。如果我有数据并且我的listview填充了数据项,一切正常,但如果我没有显示列表视图的数据项应该显示ID为“@android:id / empty”的LinearLayout但它从未显示出来并且我的应用程序在此阶段崩溃。在我的 FavoriteStudents.java 类文件中有一个AsyncTask定义。在 doInBackground 方法我检查我的手机内存中是否存在喜欢的文件为listview创建适配器,如果没有则停止AsyncTask并显示只有一个按钮的列表视图。返回之后它崩溃了doInBackground方法并向我显示了这个错误:
10-16 16:06:37.568: E/WindowManager(274): Activity com.example.hellogridview.FavoriteStudets has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44bfea80 that was originally added here
10-16 16:06:37.568: E/WindowManager(274): android.view.WindowLeaked: Activity com.example.hellogridview.FavoriteStudents has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44bfea80 that was originally added here
10-16 16:06:37.568: E/WindowManager(274): at android.view.ViewRoot.<init>(ViewRoot.java:227)
10-16 16:06:37.568: E/WindowManager(274): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
10-16 16:06:37.568: E/WindowManager(274): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-16 16:06:37.568: E/WindowManager(274): at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-16 16:06:37.568: E/WindowManager(274): at android.app.Dialog.show(Dialog.java:239)
10-16 16:06:37.568: E/WindowManager(274): at com.example.hellogridview.FavoriteStudents$readingFavFileTask.onPreExecute(FavoriteStudents.java:50)
10-16 16:06:37.568: E/WindowManager(274): at android.os.AsyncTask.execute(AsyncTask.java:391)
10-16 16:06:37.568: E/WindowManager(274): at com.example.hellogridview.FavoriteStudents.onCreate(FavoriteStudents.java:34)
10-16 16:06:37.568: E/WindowManager(274): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
10-16 16:06:37.568: E/WindowManager(274): at android.os.Handler.dispatchMessage(Handler.java:99)
10-16 16:06:37.568: E/WindowManager(274): at android.os.Looper.loop(Looper.java:123)
10-16 16:06:37.568: E/WindowManager(274): at android.app.ActivityThread.main(ActivityThread.java:4363)
10-16 16:06:37.568: E/WindowManager(274): at java.lang.reflect.Method.invokeNative(Native Method)
10-16 16:06:37.568: E/WindowManager(274): at java.lang.reflect.Method.invoke(Method.java:521)
10-16 16:06:37.568: E/WindowManager(274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-16 16:06:37.568: E/WindowManager(274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-16 16:06:37.568: E/WindowManager(274): at dalvik.system.NativeStart.main(Native Method)
我的xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/studentsList"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:listSelector="@drawable/student_list_selector" >
</ListView>
<!-- empty view -->
<LinearLayout
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/addStudents"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Students" >
</Button>
</LinearLayout>
</LinearLayout>
我的学生适配器
public class StudentsAdapter extends ArrayAdapter<Students> {
private Context context;
ImageDownloaderNew imageDownloader;
ArrayList<Students> students;
Songs studentsTemp = null;
int targetWidth = 70;
int targetHeight = 110;
public StudentsAdapter (Context context, int textViewResourceId,
ArrayList<Students> students) {
super(context, textViewResourceId, songs);
// TODO Auto-generated constructor stub
this.context = context;
this.students= students;
imageDownloader = new ImageDownloaderNew();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return students.size();
}
@Override
public Students getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
static class ViewHolder {
protected TextView studentTitle;
protected RatingBar studentRating;
protected TextView studentViews;
protected ImageView studentImage;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//My getView code goes here.I have not pasted here
return convertView;
}
}
现在是FavoriteStudents.java类文件
public class FavoriteStudents extends SherlockActivity {
ListView list;
StudentsAdapter adapter;
ArrayList<Students> studentsListArray = new ArrayList<Students>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.students_list);
new readingFavFileTask().execute(UtilityFuctions.FAV_STUDENTS_FILE_NAME);
}
private class readingFavFileTask extends AsyncTask<String, Void, String> {
ProgressDialog m_dialog = new ProgressDialog(FavoriteStudents.this);
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
// initialize the dialog
m_dialog.setTitle("Loading...");
m_dialog.setMessage("Please wait while loading...");
m_dialog.setIndeterminate(true);
m_dialog.setCancelable(true);
m_dialog.show();
}
@Override
protected String doInBackground(String... params) {
if (!UtilityFuctions.isFileExists(getApplicationContext(),
params[0])) {
// favorite file does not exists
finish();
return "fileDoesNotExists";
}else{
StudentsListArray = UtilityFuctions.readFavJSONFile(
getApplicationContext(), params[0]);
if (isCancelled())
finish();
return null;}
}
@Override
protected void onPostExecute(String result) {
list = (ListView) findViewById(R.id.studentsList);
if (result.equals("fileDoesNotExists")) {
adapter = new StudentsAdapter(FavoriteStudents.this, 1,
studentsListArray);
list.setAdapter(adapter);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View myView = inflater.inflate(R.layout.empty_view, null);
list.setEmptyView(myView);
m_dialog.dismiss();
} else {
// Creating a StudentsAdapter and setting it on listview
adapter = new StudentsAdapter(FavoriteStudents.this, 1,
studentsListArray);
list.setAdapter(adapter);
m_dialog.dismiss();
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//onItemClick code goes here
}
});
}
}
}
}
编辑:@Rolf Smith答案是正确的。但主要的问题是我在doInBackground()方法中调用了finish(),这会杀死我的活动并且没有向我显示emptyView.So我只是删除了finish()和所有内容工作得很好。
谢谢EveryOne
答案 0 :(得分:6)
空视图(使用android空id)仅在使用ListActivity或ListFragment时才有效,在这种情况下,您必须使用setEmptyView()
方法自行构建逻辑。
你遇到的崩溃可能是因为当你的活动关闭时你所显示的对话框没有被解雇。因此,例如在onPause方法中,从您显示的对话框中调用dismiss方法。
罗尔夫
编辑查看评论:
空视图将以View.GONE和View.VISIBLE显示,这意味着您无需将其添加到自己的等等。
看看这段代码: 并仔细看看onCreate方法。
import android.widget.ListView;
public class FavoriteStudents extends SherlockActivity {
ListView list;
StudentsAdapter adapter;
ArrayList<Students> studentsListArray = new ArrayList<Students>();
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.students_list);
list = (ListView) findViewById(R.id.studentsList);
View empty = findViewById(R.id.empty_view);
list.setEmptyView(empty);
new readingFavFileTask().execute(UtilityFuctions.FAV_STUDENTS_FILE_NAME);
}
private class readingFavFileTask extends AsyncTask<String, Void, String> {
ProgressDialog m_dialog = new ProgressDialog(FavoriteStudents.this);
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
// initialize the dialog
m_dialog.setTitle("Loading...");
m_dialog.setMessage("Please wait while loading...");
m_dialog.setIndeterminate(true);
m_dialog.setCancelable(true);
m_dialog.show();
}
@Override
protected String doInBackground(String... params) {
if (!UtilityFuctions.isFileExists(getApplicationContext(),
params[0])) {
// favorite file does not exists
finish();
return "fileDoesNotExists";
}else{
StudentsListArray = UtilityFuctions.readFavJSONFile(
getApplicationContext(), params[0]);
if (isCancelled())
finish();
return null;}
}
@Override
protected void onPostExecute(String result) {
if (result.equals("fileDoesNotExists")) {
adapter = new StudentsAdapter(FavoriteStudents.this, 1, studentsListArray);
list.setAdapter(adapter);
m_dialog.dismiss();
} else {
// Creating a StudentsAdapter and setting it on listview
adapter = new StudentsAdapter(FavoriteStudents.this, 1,
studentsListArray);
list.setAdapter(adapter);
m_dialog.dismiss();
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//onItemClick code goes here
}
});
}
}
}
}