私は別々のスレッドで私のロード/計算を行うために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);
}
}
);
}
私は、この
LazyLoadManager.getInstance(context).loadData(viewHolder, myModel);
使用[この](https://gist.github.com/Shywim/127f207e7248fe48400b)アダプタ – pskink
@pskinkように私のLazyLoadManagerを呼び出します:ありがとう、しかし、このアダプタは本当に私のニーズに合っていません... – user1905169
単にJOINSを使用し、フィルタリングのためにすべてのエントリを一度に読み込む必要はありません。単に 'runQueryOnBackgroundThread'をオーバーライドするか、' FilterQueryProvider' – pskink