2017-01-19 17 views
0

RecyclerViewには、sqlite databaseから数千のエントリまで、AsyncTaskLoaderでロードしています。リストをフィルタリングする必要があるので、すべてのエントリを一度に読み込む必要があります。 RecyclerViewのViewHolders内のTextViewsの中には、(初期結果に基づいて)さらなるDBクエリの結果や他のタイプの計算結果が含まれています。RecyclerView遅延読み込みTextViewコンテンツ

JOINを含めるように初期クエリを拡張すると(少なくともセカンダリクエリが廃止される)、実際に読み込みが遅くなります。しかし、RecyclerViewのonBindメソッドの中でクエリ/計算を実行すると、それらを使用しない場合よりもはるかに少ない流暢さが得られます。

TextViewsの計算にコンテンツを遅延ロードする方法はありますか?私は例を探しましたが、 "ピカソ"や "グライド"のような図書館では画像の読み込みのみが許可されています...

何か助けてください!

おかげで、 ロブ

+0

使用[この](https://gist.github.com/Shywim/127f207e7248fe48400b)アダプタ – pskink

+0

@pskinkように私のLazyLoadManagerを呼び出します:ありがとう、しかし、このアダプタは本当に私のニーズに合っていません... – user1905169

+0

単にJOINSを使用し、フィルタリングのためにすべてのエントリを一度に読み込む必要はありません。単に 'runQueryOnBackgroundThread'をオーバーライドするか、' FilterQueryProvider' – pskink

答えて

0

私は別々のスレッドで私のロード/計算を行うためにExecutorServiceを使用してSingletonクラスを使用して、Handler更新私のViewHolderを持つことになりました。これが最善の方法であれば分かりませんが、これまで問題なく動作しています。私RecyclerViewonBindViewHolder方法で

private static class LazyLoadManager { 
    private static LazyLoadManager INSTANCE; 
    private final ExecutorService pool; 
    private Map<ViewHolder, String> viewHolders = Collections.synchronizedMap(new WeakHashMap<ViewHolder, String>()); 
    private Context context; 

    private LazyLoadManager(Context context) { 
     this.context = context; 
     pool = Executors.newFixedThreadPool(5); 
    } 

    public static LazyLoadManager getInstance(Context context) { 
     if (INSTANCE == null) { 
      INSTANCE = new LazyLoadManager(context.getApplicationContext()); 
     } 
     return INSTANCE; 
    } 

    private void loadData(final ViewHolder viewHolder, final Model myModel) { 

     // Put ViewHolder and respective tag into Map 
     viewHolders.put(viewHolder, myModel.getTag()); 

     final Handler handler = new Handler(new Handler.Callback() { 
      @Override 
      public boolean handleMessage(Message msg) { 

       // Get result object 
       Model myResultModel = (Model) msg.obj; 

       // Result was initialized 
       if (myResultModel != null) { 

        // Get ViewHolder tag from map 
        String tag = viewHolders.get(viewHolder); 

        // Set ViewHolder content, if saved tag matches tag of this ViewHolder 
        if (tag != null && tag.equals(viewHolder.getTag())) { 
         viewHolder.viewA.setText(myResultModel.getThis()); 
         viewHolder.viewB.setText(myResultModel.getThat()); 
        } 
       } 
       return true; 
      } 
     }); 

     pool.submit(new Runnable() { 
         @Override 
         public void run() { 
          Model myResultModel = null; 

          if (myModel != null) { 

           // do required calculations and secondary queries based on myModel 

           myResultModel.setThis(result1); 
           myResultModel.setThat(result2); 
          } 

          Message message = Message.obtain(); 
          message.obj = myResultModel; 

          handler.sendMessage(message); 
         } 
        } 

     ); 
    } 

私は、この

LazyLoadManager.getInstance(context).loadData(viewHolder, myModel);