0

カスタム配列アダプターを介してリストに入力するデータがない場合に備えて、リストビューにボタンを表示したかったのですが、データがあり、リストビューがデータ項目で満たされている場合はすべて正常に機能しますが、 listview は ID " @android :id/empty" の LinearLayout を表示する必要があることを示しますが、これは表示されず、この段階でアプリケーションがクラッシュしましたお気に入りのファイルが電話の内部メモリに存在する場合は、リストビュー用のアダプターを作成します。そうでない場合は、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>

My Student アダプター

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

                    }
                });
            }
        }
    }

}

EDIT:@Rolf Smithの答えは正しいです.しかし、主な問題は、doInBackground()メソッドでfinish()を呼び出していることです. みんな、ありがとう

4

1 に答える 1

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

                    }
                });
            }
        }
    }

}
于 2012-10-16T10:48:24.287 に答える