【问题标题】:Not be able to update the list view, after removing some items删除某些项目后无法更新列表视图
【发布时间】:2016-04-23 08:14:09
【问题描述】:

我必须在优化运行的应用程序后更新列表......

   m_optimizeBtn.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
        launchProgressRing(OptimizationActivity.this);
            listAdaptor.notifyDataSetChanged();
        }
    });
}

在单独的线程中杀死正在运行的进程......

    public void launchProgressRing(Context ctx){
    final ProgressDialog opt_proDialog=new ProgressDialog(ctx);
    opt_proDialog.setTitle("Please wait...");
    opt_proDialog.setMessage("Optimizing power draining apps...");
    opt_proDialog.setIndeterminate(true);
    opt_proDialog.show();
    opt_proDialog.setCancelable(false);
    new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            //TODO: optimize apps
            m_cPowerDrainingApps.killBgRunningProcesses(runningAppsList);
            try
            {
                Thread.sleep(1500);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    opt_proDialog.dismiss();
                }
            });
        }
    }).start();
}

listAdaptor.notifyDataSetChanged() 不工作,不知道为什么???

【问题讨论】:

  • 将您的 listview.setAdapter(您的适配器) 放入 onResume() 方法,如果不起作用,则放入您的 Activity 代码。
  • 如何更改列表适配器中的数据?线程对此有什么作用吗?
  • @Pooya 。 m_cPowerDrainingApps.killBgRunningProcesses(runningAppsList) 这负责数据更改......它正在从列表中删除一些进程......

标签: java android listview arraylist


【解决方案1】:

我建议使用 AsyncTask 来完成这项工作。 AsyncTask 有两个很好的方法供你使用:

  • doInBackground:可以将大部分后台任务放在那里
  • onPostExecute :您可以在其中放置后台任务完成工作后需要执行的操作的逻辑。

所以你的代码应该是这样的:

public class BackgroundTask extends AsyncTask<Void,Void,Void>{

   private ListAdapter mAdapter;

   public BackgroundTask(ListAdapter adapter)
   {
      mAdapter = adapter
   }

   public Void doInBackground (Void... params)
   {
      //define m_cPowerDrainingApps somewhere
      m_cPowerDrainingApps.killBgRunningProcesses(runningAppsList);
      try
      {
           Thread.sleep(1500);
      } catch (InterruptedException e)
      {
           e.printStackTrace();
      }
   }

   public Void onPostExecute (Void... params)
   {
      //do your UI things
      mAdapter.notifyDataSetChanged();
   }
}

然后运行:

new BackgroundTask(listAdapter).execute()

【讨论】:

    【解决方案2】:

    使用 Handler 及其 postDelayed 方法使列表的适配器失效,如下所示:

    final Handler handler = new Handler()
    handler.postDelayed( new Runnable() {
    
        @Override
        public void run() {
            adapter.notifyDataSetChanged();
            handler.postDelayed( this, 60 * 1000 );
        }
    }, 60 * 1000 );
    

    您只能在主 (UI) 线程中更新 UI。

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多