如果我不得不發送請求以獲取onBindViewHolder()
以內的數據,那麼在數據從服務器返回後,如何更新視圖?如何從服務器提取數據後更新recyclerview?
我現在所擁有的是我將數據與行位置一起緩存,以便下次用戶滾動到該行時,我可以立即顯示信息。
但還有2個其他問題我不知道如何解決。
- 我滾動列表查看位置10,11和12處的項目。我決定等待數據返回。之後我打電話
notifyDataSetChanged()
?因爲onBindViewHolder
已經被數據返回的時間調用並且視圖將保持爲空,但是我也不認爲在每個請求都是好主意後調用notifyDataSetChanged()
。 - 我開始查看位置0處的列表,並保持滾動到位置10.應用程序發送請求以將位置0的數據提取爲10.由於0處的請求首先發送出去,所以它更有可能首先返回或至少比位置10快,但那時我已經在位置10查看該項目了。如果所有請求都返回,我的視圖將開始改變,所以它將顯示位置0的數據,然後一直保持更新10.
從服務器加載數據爲recyclerview
卷軸是一種不好的做法嗎?但通過這樣做會爲我節省很多時間,我想也是爲了用戶?因爲不是提前發送所有請求,用戶可以看到部分數據,而其他數據正在後臺加載。
謝謝!
EDITED
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
private Context ctx;
private ArrayList<Photo> alPhotos = new ArrayList<>();
private HashMap<String, Drawable> hmImages = new HashMap<>();
public TestAdapter(Context ctx, ArrayList<Photo> alPhotos) {
this.ctx = ctx;
this.alPhotos = alPhotos;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_photo_brief, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Photo photo = alPhotos.get(position);
loadRemoteImage(photo.IMG, holder.ivThumb, true);
holder.tvEmail.setText(photo.EMAIL);
}
@Override
public int getItemCount() {
return alPhotos.size();
}
private void loadRemoteImage(final String imgUrl, final ImageView view, final boolean cache) {
if (hmImages.containsKey(imgUrl)) {
view.setImageDrawable(hmImages.get(imgUrl));
} else {
final WeakReference<ImageView> weakView = new WeakReference<>(view);
RequestManager.getManager().add(new Request<>(imgUrl, new DrawableParser(), new RequestCallback<Drawable>() {
@Override
public void onFinished(Request<Drawable> request, Response<Drawable> response) {
if (cache) hmImages.put(imgUrl, response.result);
ImageView view = weakView.get();
if (view != null) {
view.setImageDrawable(response.result);
}
}
@Override
public void onError(Request<Drawable> request, Response<Drawable> response) {
}
@Override
public void onTimeout(Request<Drawable> request, Response<Drawable> response) {
}
})
);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView ivThumb;
private TextView tvEmail;
public ViewHolder(View itemView) {
super(itemView);
findViews();
}
private void findViews() {
ivThumb = (ImageView) itemView.findViewById(R.id.ivThumb);
tvEmail = (TextView) itemView.findViewById(R.id.tvEmail);
}
}
}
更新像arraylist –
您的數據,但視圖更新內'onBindViewHolder'。即使數據集已更新,「onBindViewHolder」也不會被再次調用。 – user1865027