如果我的适配器为空,如何在Listview中显示emptyview?

时间:2012-10-16 10:42:41

标签: android android-listview android-asynctask android-adapter

我想在我的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

1 个答案:

答案 0 :(得分:6)

空视图(使用android空id)仅在使用ListActivity或ListFragment时才有效,在这种情况下,您必须使用setEmptyView()方法自行构建逻辑。

ListView.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

                    }
                });
            }
        }
    }

}