0

私は非常に一般的なシナリオを持っています。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> 
+0

メモリとネットワークポリシーをピカソコードで追加しようとしました。 –

+0

'Picasso.resumeTag'と' Picasso.PauseTag'をチェックしましたか? –

+0

Divyesh、これはデフォルトのPicasaの動作(メモリ+ディスクのcatche)ではないはずですか?スクロールしながらピカソ画像の読み込みを一時停止/再開しますか? – daneejela

答えて

0

私はあなたのコードに問題がonCreateViewHolder()で、それはこの

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.contact_item, parent, false); 
    return new ViewHolder(v); 
} 

のようになりますし、あなたのViewHolderコンストラクタコンストラクタで、あなたがバインドしようとしている、このようになるはずだと思いますあなたのlistItemの

public ViewHolder(View v) { 
    super(v); 
    itemBinding = DataBindingUtil.bind(view);; 
} 

は詳細

ため RecyclerView With Android DataBindingを参照してください。
+0

申し訳ありませんが、私はあなたのソリューションを試してみましたが、私は同じ問題を抱えています。 多くのアイテム(画面の高さを超える)を使用してソリューションを試しましたか? バックアップをスクロールするときにリロードしませんか? – daneejela

関連する問題