如何更新ListView项中的进度条

时间:2013-10-30 16:55:44

标签: android android-listview android-progressbar android-download-manager

我有一个ListView附加到ArrayAdapter。当用户点击ListView中某个项目的下载按钮时,使用DownloadManager开始下载。

我想要做的是使用进度条跟踪下载进度(放置在项目布局中)。如何实现这一目标?

Pocket Cast的表现方式非常出色我所追求的目标:

Pocket Cast exampel http://www.mrcrab.net/images/thumb_big/9982-Pocket_Casts_Apk_v4.3.2_Android-0.jpg

注意:我知道如何使用DownloadManager,这是即时更新进度条很棘手。

2 个答案:

答案 0 :(得分:17)

这是我最终解决它的方式(经过多次迭代和不同的实现)。这有点棘手,但基本上你需要三件事:

  1. 收集元数据的AsyncTask
  2. 滚动侦听器,告诉我们用户何时停止滚动/投掷
  3. 一种聪明的算法,可找到任何需要更新的可见行,并要求适配器仅更新该特定行
  4. 这是我设计和实施它的方式:

    Screenshot

    我更详细地写了关于it here的内容,请参阅github code了解完整的内容。

        private class UpdaterAsyncTask extends AsyncTask<Void, Void, Void> {
    
        boolean isRunning = true;
    
        public void stop() {
            isRunning = false;
        }
    
        @Override
        protected Void doInBackground(Void... params) {
    
            while (isRunning) {
    
                // Gather data about your adapter objects
                // If an object has changed, mark it as dirty                
    
                publishProgress();
    
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            return null;
        }
    
        @Override
        protected void onProgressUpdate(Void... params) {
            super.onProgressUpdate();
    
            // Update only when we're not scrolling, and only for visible views
            if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                int start = mListview.getFirstVisiblePosition();
                for(int i = start, j = mListview.getLastVisiblePosition(); i<=j; i++) {
                    View view = mListview.getChildAt(i-start);
                    if (((Content)mListview.getItemAtPosition(i)).dirty) {
                        mListview.getAdapter().getView(i, view, mListview); // Tell the adapter to update this view
                    }
    
                }
            }
    
          }
        }
    

答案 1 :(得分:0)

对于特定的视图项,您可以使用getChildAt(int index)检索它并更新它。

您可以在getFirstVisiblePosition()getLastVisiblePosition()

的帮助下遍历所有可见项目