在列表视图上触摸项目时显示进度对话框

时间:2014-09-08 10:29:39

标签: android listview progressdialog

我有一个列表视图,我希望当我触摸列表视图中的项目时,我的进度对话框会打开并显示加载消息。 一切都很好但是当我触摸项目看到对话框我的应用程序崩溃。但如果我滚动列表,然后触摸项目我的应用程序确实给出了错误。 当数据从网络收集并显示时,我会在下一个活动中关闭该对话框。

这是我的listview填充鳕鱼

 public void fill(final ArrayAdapter<RssParser.Item> adapter, final RssParser.Item item, final int position)
    {

        try
        {

            Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    RecruitmentActivity.handler.post(new Runnable() {

                        @Override
                        public void run() {
                            ActivityFirst.dismissLoadingDialog();
                            txtTitle.setText(item.title);
                            txtDate.setText(item.pubDate);
                            txt_time.setText(item.time);
                            txtDescription.setText(item.description);
                            layoutRoot.setOnClickListener(new OnClickListener() {

                                @Override
                                public void onClick(View v) {

                                    ((Activity) context).runOnUiThread(new Runnable() {

                                        @Override
                                        public void run() {
                                            if (progress == null) {
                                                progress = new ProgressDialog(context);
                                                progress.setTitle("title");
                                                progress.setMessage("loading");
                                                progress.setCanceledOnTouchOutside(false);
                                                progress.setCancelable(false);
                                            }
                                            progress.show();
                                            G.SelectedApplication = item;
                                            Intent intent = new Intent(G.context, Adapter_Description.class)
                                                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                            intent.putExtra("INPUT", item.link + "");
                                            intent.putExtra("INPUT_DESC", item.description + "");
                                            G.context.startActivity(intent);
                                        }
                                    });
                                }
                            });

                        }

                    });
                }
            });

            thread.start();

这是我的解雇方法

public static void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

这是我的日志

  

09-07 20:44:23.227:E / AndroidRuntime(1461):致命异乎寻常:主要   09-07 20:44:23.227:E / AndroidRuntime(1461):android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌android.os.BinderProxy@a65f2178无效;你的活动在运行吗?   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.view.ViewRootImpl.setView(ViewRootImpl.java:567)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)   09-07 20:44:23.227:E / AndroidRuntime(1461):**   在android.app.Dialog.show(Dialog.java:281)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在 com.employment.app.find_work.recruitment.AdapterItems $ ViewHolder $ 1 $ 1 $ 1.onClick(AdapterItems.java:89   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.view.View.performClick(View.java:4204)
  09-07 20:44:23.227:E / AndroidRuntime(1461):**
  在android.view.View $ PerformClick.run(View.java:17355)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.os.Handler.handleCallback(Handler.java:725)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.os.Handler.dispatchMessage(Handler.java:92)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.os.Looper.loop(Looper.java:137)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在android.app.ActivityThread.main(ActivityThread.java:5041)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  at java.lang.reflect.Method.invokeNative(Native Method)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在java.lang.reflect.Method.invoke(Method.java:511)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)   09-07 20:44:23.227:E / AndroidRuntime(1461):
  在dalvik.system.NativeStart.main(本地方法)

2 个答案:

答案 0 :(得分:0)

中添加代码点击事件代码
your_activity_name.runOnUiThread(new Runnable() {
        @Override
        public void run() {
             if (progress == null) {
                        progress = new ProgressDialog(context);
                        progress.setTitle("title");
                        progress.setMessage("loading");
                        progress.setCanceledOnTouchOutside(false);
                        progress.setCancelable(false);
              }
              progress.show();
              G.SelectedApplication = item;
              Intent intent = new Intent(G.context, Adapter_Description.class)
                     .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              intent.putExtra("INPUT", item.link + "");
              intent.putExtra("INPUT_DESC", item.description + "");
              G.context.startActivity(intent);
        }
    });

将您的代码放入run方法。

答案 1 :(得分:0)

1)确保“context”变量指向活动,而不是其他任何一个。

2)非常有趣,因为在这种情况下你应该得到“无法触摸视图”异常,而不是错误的窗口绑定标记异常。 有可能:

  • 您的申请已经按照规定已经死亡(即过去的onPause())。

  • 由于线程嵌套混乱,您正在触摸UI线程外部的UI控件,这是唯一可以修改视图的控件。尝试: runOnUiThread(new Runnable(){

    @Override
    public void onClick(View v)  {
        runOnUiThread(new Runnable() {
            // Your code related to controlling the progress bar
        })
    }
    

    您还可以使用处理程序通知视图(实际上更可取)

3)确保在旧活动消失之前解除对话框。