在将数据从arraylist加载到listview时显示进度条

时间:2018-01-30 06:15:51

标签: java android listview

我在单击另一个ListView后出现的AlertDialog中有一个ListView。流程看起来像这样:

MainActivity

上面的屏幕截图是MainActivity。单击此列表中的任何内容将显示以下对话框:

Dialog

但问题是,对话框在listview中包含listview。因此,加载视图需要几秒钟。所以,我在加载视图之前尝试显示进度对话框。所以,我做了类似的事情:

            ProgressDialog pd = new ProgressDialog(MainActivity.this);
            pd.setMessage("loading");
            pd.show();

            ArrayList<Teacher> teachers = subs.get(position).getTeachers();
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_layout, null);
            builder.setView(v);

            ListView listViewDialog = (ListView) v.findViewById(R.id.dialog_lv);
            TesAdapter adapter1 = new TesAdapter(MainActivity.this, teachers);
            listViewDialog.setAdapter(adapter1);
            adapter1.notifyDataSetChanged();
            listViewDialog.setDivider(null);

            pd.hide();
            builder.show();

但是进度对话框没有显示&amp;仍然需要更多时间来加载警报对话框。所以,我尝试了这段代码:

            final ProgressDialog pd = new ProgressDialog(MainActivity.this);
            pd.setMessage("loading");
            pd.show();
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            final View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_layout, null);
            builder.setView(v);
            builder.show();


            AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    ArrayList<Teacher> teachers = subs.get(position).getTeachers();
                    ListView listViewDialog = (ListView) v.findViewById(R.id.dialog_lv);
                    TesAdapter adapter1 = new TesAdapter(MainActivity.this, teachers);
                    listViewDialog.setAdapter(adapter1);
                    adapter1.notifyDataSetChanged();
                    listViewDialog.setDivider(null);
                    pd.hide();
                }
            });

但得到了这个错误:

WindowManager: android.view.WindowLeaked

任何解决方案?提前谢谢......

5 个答案:

答案 0 :(得分:0)

我认为你应该使用可扩展的RecyclerView来处理你所面临的所有异常。请检查link。这是一个整洁的设计,解决了您的问题。让我知道

答案 1 :(得分:0)

尝试将pd.hide更改为pd.dismiss,并在活动的onPause中添加pd.dismiss

答案 2 :(得分:0)

因为您正尝试从工作线程访问UI元素。 UI部分必须从主线程执行,如下所示:

AsyncTask.execute(new Runnable() {
            @Override
            public void run() {

                ArrayList<Teacher> teachers = subs.get(position).getTeachers();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ListView listViewDialog = (ListView) v.findViewById(R.id.dialog_lv);
                        TesAdapter adapter1 = new TesAdapter(MainActivity.this, teachers);
                        listViewDialog.setAdapter(adapter1);
                        adapter1.notifyDataSetChanged();
                        listViewDialog.setDivider(null);
                        pd.dismiss(); // CHANGE HERE
                    }
                });


            }
        });

答案 3 :(得分:0)

整个过程的用户异步任务。在onPreExecute()中显示对话框并关闭对话框,并通过onPostExecute()中的适配器将数据设置为listview。对doInBackGround()中的数据执行其他操作。切记不要在doInBackGround()中执行任何与UI相关的操作。

答案 4 :(得分:0)

首先尝试使用Recycler视图,尽管使用listview,并且根据您的问题,您可以在对话框中使用Expandable recycleler视图,有许多库可用于:https://github.com/thoughtbot/expandable-recycler-view

相关问题