2017-01-19 5 views
0

RecyclerViewsqlite database에서 수천 개의 항목으로 채우고 AsyncTaskLoader을 통해로드합니다. 목록을 필터링 할 수 있어야하므로 모든 항목을 한 번에로드해야합니다. RecyclerView의 ViewHolders에있는 TextViews 중 일부는 추가 DB 쿼리 (초기 결과 기반) 또는 다른 유형의 계산 결과를 포함합니다.RecyclerView 지연된 TextView 내용

JOIN을 포함하도록 초기 쿼리를 확장하면 (적어도 보조 쿼리를 쓸모 없게 만들 것임) 실제로로드가 느려집니다. 그러나 RecyclerView의 onBind 메서드 내에서 쿼리/계산을 수행하면 flunging이 훨씬 덜 유창하게됩니다.

계산 된 내용을 지연로드하는 방법이 있습니까? TextViews? 예를 찾아 보았지만 "Picasso"와 "Glide"와 같은 라이브러리는 이미지로드 만 허용합니다 ...

도움을 주셨습니다.

덕분에, 롭

+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); 
         } 
        } 

     ); 
    } 

I 다음이

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