2017-03-29 8 views
0

アクティビティを開くと、私は長い(10 sek)プロセスを開始します。このプロセスは10項目のリストを作成します。 10秒後に終了します。その結果リストは10秒後に表示されます(UIアップデート)。AsyncTask.onProgressUpdate()が終了したときのUIの更新方法

しかし、作成した直後にすべてのアイテムを表示する必要があります。したがって、最初の項目は1秒後に表示する必要があります。

だから私はこのためにAsyncTaskを作成します。

onCreate() { 
BackgroundTask backgroundTask = new BackgroundTask(); 
    backgroundTask.execute(newsDetailsList); 
} 

    private class BackgroundTask extends AsyncTask<List<NewsDetails>, NewsDetails, Void> { 


     @Override 
     protected Void doInBackground(List<NewsDetails>... newsDetailsList) { 
      List<NewsDetails> passedList = newsDetailsList[0]; 
      for (NewsDetails newsDetails : passedList) { 
       publishProgress(newsDetails); 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(final NewsDetails... passedNewsDetails) { 
      super.onProgressUpdate(passedNewsDetails); 
      final NewsDetails newsDetails = passedNewsDetails[0]; 
      // here create UI for new items newsDetails 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
     } 
} 

しかし、UIがonPostExecute(10秒後)()仕上げ後に更新されます。しかし、すべての仕上げ(10回)メソッドの後にUIを更新する必要がありますonProgressUpdate()

どうすればいいですか?

答えて

0

だけBasicly

 @Override 
     protected void onProgressUpdate(final NewsDetails... passedNewsDetails) { 
      super.onProgressUpdate(passedNewsDetails); 
       adapter.notifyDataSetChanged(); 
     } 

notifyDataSetChanged

を呼び出すには、それぞれの時間進行が

+0

私はリストのリストビューを使用していません。私は組み込みLinearlayoutsを使用してUiを作成します。したがって、10項目のリストは、1つのメイン直線レイアウトの10線形レイアウトです。結果として、私はadapter.notifyDatasetChanged()を呼び出すことができません。 – Alexei

0

を更新リストビューを更新する新しいクラスを作成します。

public interface NewsDetailsInterface{ 
void receiveData(Object object); 
} 

その後、抽象的にあなたのASyncTaskを変更し、実装インターフェース:

private abstract class BackgroundTask extends AsyncTask<List<NewsDetails>, 
NewsDetails, Void> implements NewsDetailsInterface{ 

public abstract receiveData(Object object); 

//.. the rest of your task below .. 

あなたがASyncTaskをインスタンス化しているところはどこでも、その後、あなたはこのようにそれを再作成する必要があります:今

BackgroundTask backgroundTask = new BackgroundTask(){ 
      @Override 
      public void receiveData(Object object) { 
       //do something with the object, like create a new list item 
      } 
     }; 

、あなたのインターフェイス、それが呼ばれるあなたのdoInBackground、毎回で1秒ごとreceiveDataを呼び出すことができますそのデータですぐに何かを行います:

@Override 
    protected Void doInBackground(List<NewsDetails>... newsDetailsList) { 
     List<NewsDetails> passedList = newsDetailsList[0]; 
     for (NewsDetails newsDetails : passedList) { 
      receiveData(newsDetails); 
     } 
     return null; 
    } 
+0

バックグラウンドで作成できないWebViewを使用しています。私はこれが問題だと思う – Alexei

関連する問題