私は非常に一般的なシナリオを持っています。Androidのリストイメージは、スクロールアップ/バック時にリロードされます(レイジーローディング、Picasso、androidデータバインディングを使用)
Androidデータバインディングライブラリを使用してMVVMパターンを実装しようとしています。
私はPicassoライブラリで画像を読み込んでいます。
私は解決しなければならない問題が1つありますが、それ以外はすべて魅力的です - 画像をスクロールして戻す/リストを上げると画像がリロードされます。例えば
、私は画面に入り初めて:
1)私は、スクロールダウン)実画像が
3をロードされた直後にプレースホルダ
2)を参照してください - 私はより多くを参照してくださいプレースホルダは他の画像がロードされた直後に(そしてそれは結構です、遅延ロード)
4))(偉大
5)上にスクロール - 私はプレースホルダを見ます - ???問題 - これを避け、代わりに以前に読み込まれたイメージを表示する方法?ここ
(私は、関連する部分にそれを簡略化した)コードである:
ContactListAdapter.java
public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.ViewHolder> {
private List<Contact> items;
public Contact ListAdapter() {
this.items = Collections.emptyList();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ContactItemBinding itemBinding =
DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.contact_item,
parent, false);
return new ViewHolder(itemBinding);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bindItems(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
public void setList(List<Contact> items) {
this.items = items;
notifyDataSetChanged();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
ContactItemBinding itemBinding;
public ViewHolder(ContactItemBinding contactItemBinding) {
super(contactItemBinding.habitItem);
this.itemBinding = habitItemBinding;
}
void bindItems(Contact item) {
if (itemBinding.getViewModel() == null) {
itemBinding.setViewModel(
new ContactItemViewModel(item, itemView.getContext()));
} else {
itemBinding.getViewModel().setItem(item);
}
}
}
}
ContactItemViewModel.java
public class ContactItemViewModel extends BaseObservable {
private Contact item;
private Context context;
public Contact getItem() {
return item;
}
public ContactItemViewModel(Contact item, Context context) {
this.item = item;
this.context = context;
}
public void onItemClick(View view) {
context.startActivity(ContactDetailActivity.launchDetail(view.getContext(), item));
}
public void setItem(Contact item) {
this.item = item;
notifyChange();
}
@BindingAdapter("android:src")
public static void loadImage(ImageView view, String imageUrl) {
Picasso.with(view.getContext())
.load(imageUrl)
.placeholder(R.drawable.loading_image)
.error(R.drawable.error_image)
.into(view);
}
は}
はcontact_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.danijela.sparkle.viewmodel.ContactItemViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/contact_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@{viewModel.item.imageUrl}" />
<TextView
android:id="@+id/contact_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@{viewModel.item.fullName}" />
</LinearLayout>
</layout>
メモリとネットワークポリシーをピカソコードで追加しようとしました。 –
'Picasso.resumeTag'と' Picasso.PauseTag'をチェックしましたか? –
Divyesh、これはデフォルトのPicasaの動作(メモリ+ディスクのcatche)ではないはずですか?スクロールしながらピカソ画像の読み込みを一時停止/再開しますか? – daneejela