我結束了使用Singleton
類使用ExecutorService
做在單獨的線程我加載/計算,然後具有Handler
更新我ViewHolder
。不知道,如果這是做到這一點的最佳方式,但到目前爲止它的工作沒有任何問題。
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);
}
}
);
}
以我RecyclerView
的onBindViewHolder
方法然後我打電話給我LazyLoadManager這樣
LazyLoadManager.getInstance(context).loadData(viewHolder, myModel);
使用[此](https://gist.github.com/Shywim/127f207e7248fe48400b)適配器 – pskink
@pskink :謝謝,但是這個適配器並不適合我的需求... – user1905169
只需使用JOINS,並且不需要,用於過濾不需要立即加載所有條目,只需重寫'runQueryOnBackgroundThread'或設置它的'FilterQueryProvider' – pskink