나는 별도의 스레드에서 내로드/계산을하기 위해 ExecutorService
를 사용하여 Singleton
클래스를 사용하고 Handler
갱신 내 ViewHolder
을 가진 끝났다. 이것이 최선의 방법 일지 모르지만, 지금까지 아무 문제없이 일하고 있습니다. 제 RecyclerView
의 onBindViewHolder
방법에
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);
사용 [이 (https://gist.github.com/Shywim/127f207e7248fe48400b) 어댑터 – pskink
@pskink처럼 내 LazyLoadManager 전화 : 고마워,하지만이 어댑터는 내 요구에 맞지 않는다. ... – user1905169
그냥 JOINS를 사용하고, 필터링을 위해 필터링을하지 않고 모든 항목을 한 번에로드 할 필요없이'runQueryOnBackgroundThread'를 덮어 쓰거나 'FilterQueryProvider'를 설정하면된다. – pskink