web-dev-qa-db-ja.com

ListViewアイテムのプログレスバーを更新する方法

ListViewArrayAdapterが添付されています。ユーザーがListView内のアイテムのダウンロードボタンをクリックすると、ダウンロードはDownloadManagerの使用を開始します。

私がやりたいのは、プログレスバー(アイテムレイアウトに配置)を使用してダウンロードの進行状況を追跡することです。これはどのように達成できますか?

Pocket Castのやり方は、まさに私が求めているものです。

ポケットキャストの例http://www.mrcrab.net/images/thumb_big/9982-Pocket_Casts_Apk_v4.3.2_Android-0.jpg

注:DownloadManagerの操作方法を知っています。注意が必要なのは、プログレスバーの即時更新です。

15
Mike

これは私が最終的にそれを解決した方法です(多くの反復と異なる実装の後)。少し注意が必要ですが、基本的に3つのことが必要です。

  1. メタデータを収集するAsyncTask
  2. ユーザーがスクロール/フリングを停止したことを通知するスクロールリスナー
  3. 更新が必要な表示行を見つけて、その特定の行のみを更新するようにアダプターに要求する巧妙なアルゴリズム

これは私がそれを設計して実装した方法です:

Screenshot

ここにあります について詳しく書きました。完全な実装については、 githubコード を参照してください。

    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
                }

            }
        }

      }
    }
17
Mike

特定のビューアイテムについては、 getChildAt(int index) を使用して取得し、更新できます。

そして、 getFirstVisiblePosition() および getLastVisiblePosition() を使用して、表示されているすべてのアイテムをトラバースできます。

0
huy.nguyen