2017-10-04 21 views
0

コンテンツを更新した後にRecyclerViewに現在のスクロール位置を保持するにはどうすればよいですか?私はその後、呼び出しタスクが完了するとスクロール位置を保持してRecyclerViewを更新する

private class getArrivals extends AsyncTask<Long, Void, Long>{ 

     @Override 
     protected void onPreExecute(){ 
      //emptyMessage.setVisibility(VISIBLE); 
      //recyclerView.setVisibility(GONE); 
     } 
     @Override 
     protected Long doInBackground(Long... params) { 
      long station_id = params[0]; 
      station = db.stationModel().getStationById(station_id); 
      arrivals = db.arrivalModel().getNextArrivalsByStation(station_id, StaticClass.getDays()); 
      return station_id; 
     } 

     @Override 
     protected void onPostExecute(Long result){ 
      if(getSupportActionBar() != null) { 
       getSupportActionBar().setTitle(capitalize(station.name)); 
      } 

      refreshList(); 
     } 
} 

private void setRepeatingAsyncTask() { 

    final Handler handler = new Handler(); 
    Timer timer = new Timer(); 

    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         new getArrivals().execute(station_id); 
        } catch (Exception e) { 
         // error, do something 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(task, 0, 30000); // interval of 30 seconds 
} 

AsyncTaskは、最新のリストの内容をデータベースに照会します:次のように

onCreateでは、私は繰り返すタスクを設定します

private void refreshList(){ 

    arrivalListAdapter = new ArrivalListAdapter(getApplicationContext(), arrivals); 
    staggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(staggeredGridLayoutManager); 
    recyclerView.setAdapter(arrivalListAdapter); 
    Log.d("arrivals", arrivals.size()+""); 
    arrivalListAdapter.notifyDataSetChanged(); 

    if(arrivals.size() == 0){ 
     emptyMessage.setVisibility(VISIBLE); 
     recyclerView.setVisibility(GONE); 

     new fetchArrivalsFromSource().execute(station.id); 
    }else{ 
     emptyMessage.setVisibility(GONE); 
     recyclerView.setVisibility(VISIBLE); 
    } 
} 

私は前もって更新しています私の問題の理由は、毎回アダプタを設定しているということです。私は最初のタスクでそれを設定しようとしましたが、それは全く更新されていないリストにつながります。

答えて

5

あなたは、現在の位置を取得し、このような前の位置にアダプタとスムーズなスクロールをリフレッシュすることができます。

RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(context) { 
    @Override protected int getVerticalSnapPreference() { 
    return LinearSmoothScroller.SNAP_TO_START; 
    } 
}; 

その後にスクロールする位置に設定します。

smoothScroller.setTargetPosition(position); 
layoutManager.startSmoothScroll(smoothScroller); 
関連する問題