14

ArrayAdapterにはListViewが添付されています。ユーザーがListViewの項目のダウンロードボタンをクリックすると、DownloadManagerを使用してダウンロードが開始されます。ListViewアイテムのプログレスバーを更新する方法

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

ポケットキャストが、それは私が後だ何exaclyでない方法:

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

注:私はDownloadManagerで作業する方法を知って、それがトリッキーであるプログレスバーのインスタント更新です。

答えて

16

の助けにより、すべての可視アイテムを横断することができます。それは少しトリッキーですが、基本的に次の3つが必要です。メタデータ

  • 目に見えるが見つかった巧妙なアルゴリズムを投げつけ、ユーザーがスクロールを停止したときを教えてくれるスクロールリスナーを/収集

    1. アンAsyncTaskを

      :これは私が設計し、それを実装する方法がある特定の行

    更新のみにアダプタを更新する必要がありますと尋ねる行

    詳しくは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 
           } 
    
          } 
         } 
    
         } 
        } 
    
  • +0

    こんにちは、私はそれを作ろうとしますが、私は鉛を持っています。 BackButtonを押すと、dlが続行されます(これが私の望みです)が、このビューに戻ると、progressBarsは移動しません。あなたはあなたのアダプターの例を載せることができますか?あなたが背中を押して同じ見方に戻るとき、それは私のように機能しますか? – Cocorico

    +0

    はい、「アクティビティ」が開始されたとき、および(休止状態から)アクティビティを再開したときに機能します。ここでソースコードの 'private void refreshScreen()'を見てください:https://github.com/slidese/SGU/blob/master/src/se/slide/sgu/StartActivity.java – Mike

    0

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

    そして、あなたは、これは私が最終的に(多くの反復と異なる実装後)、それを解く方法ですgetFirstVisiblePosition()getLastVisiblePosition()

    +0

    特定のビューがダウンロード可能な状態になっているかどうかはどのように分かりますか? 'DownloadManager'を照会する' AsyncTask'があると仮定しますので、ダウンロードIDは0個以上残っていますが、これらが対応する 'ListView'アイテムが何であるか分かりません。または私はここに何かを逃していますか? – Mike

    +0

    ダウンロードIDを使用すると、URIを取得できます(DownloadManagerに問い合わせるか、ダウンロードIDとURIが一致する独自のマップを使用します)。 'ListView'の位置から、アダプタからURIを取得できます。 これで、ダウンロードIDと 'ListView'位置の間にリンクがあります。 –

    +0

    また、ダウンロードIDと 'ListView'の位置を格納するマップを持つことさえできます。このマップは、 'DownloadManager'でリクエストをエンキューするときに操作できます。 –

    関連する問題