2

Androidが新機能です。私は現在、書籍のリストが表示されているリストビュー画面を持つアプリケーションを構築しようとしています。各アイテムにはURLからダウンロードしたイメージがあり、POJOオブジェクトに設定された値に基づいてイメージリソースの2つのアイコンが設定されます。Android Recyclerのアイテムシーケンスの問題

マイアダプタのコードは以下の通りです:

Context context = view.getContext(); 
    view.setLayoutManager(new LinearLayoutManager(context)); 
    view.setAdapter(new MySearchBooksItemRecyclerViewAdapter(SearchBooks.ITEMS, mListener, getActivity())); 

public void onBindViewHolder(final ViewHolder holder, int position) { 
    Log.d(TAG, "onBindViewHolder: binding variables of object: " + position); 
    Log.d(TAG, "onBindViewHolder: holder value: " + holder.mItem); 
    Log.d(TAG, "onBindViewHolder: holder value: " + holder.mTitle); 
    Log.d(TAG, "onBindViewHolder: holder value: " + holder.mISBN); 

    holder.mItem = mValues.get(position); 
    holder.mTitle.setText(mValues.get(position).getTitle()); 
    holder.mTitle.setTag(mValues.get(position).getId()); 
    holder.mISBN.setText(mValues.get(position).getIsbn()); 
    holder.mDesc.setText(mValues.get(position).getDesc()); 
    holder.mView.setOnClickListener(new ClickListItem()); 

    getImages(holder.mBookImage, mValues.get(position).getImage()); 

    if (bookList.get(mValues.get(position).getId()) != null) { 
     holder.mIsFav.setImageResource(bookList.get(mValues.get(position).getId()).isBookmarked() ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_border_white_24dp); 
     holder.mIsDownloaded.setImageResource(new File(bookList.get(mValues.get(position).getId()).getSavedBookName()).exists() ? R.drawable.ic_offline_pin_white_24dp : R.drawable.ic_get_app_white_24dp); 
    } 

    Log.d(TAG, "onBindViewHolder: variables bound: " + mValues.get(position)); 
} 

@Override 
public int getItemCount() { 
    Log.d(TAG, "getItemCount: item count: " + mValues.size()); 
    return mValues.size(); 
} 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:backgroundTint="@android:color/darker_gray" 
    android:orientation="horizontal"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="5" 
     android:background="@color/background_material_dark" 
     android:orientation="vertical"> 

     <ImageView 
      android:id="@+id/bookImage" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:minHeight="100dp" 

      android:layout_weight="2" 
      android:src="@drawable/icon_img_tu" /> 

     <LinearLayout 
      android:layout_weight="1" 
      android:minHeight="40dp" 
      android:layout_gravity="center" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:orientation="horizontal"> 

      <ImageView 
       android:id="@+id/is_fav_image" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:src="@drawable/ic_favorite_border_white_24dp" /> 

      <ImageView 
       android:id="@+id/is_downloaded_image" 
       android:layout_weight="1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="@color/background_material_dark" 
       android:src="@drawable/ic_get_app_white_24dp" /> 

     </LinearLayout> 
    </LinearLayout> 

私は、画面をスクロールしたときに今、問題が来ます。最初の負荷でアイコンの値と画像が完全に読み込まれます。しかし、私が横にスクロールして戻ってくると、 'onBindViewHolder'が再び呼び出され、誤った乱数値が使用されます。画像に間違ったアイコンが表示されます。

誰でもこの問題を解決する方法を教えていただけますか?

+0

他のステートメントは、あなたがヌルのIDをチェックする場所、静的な画像を設定するelse節に追加します。 –

+0

私はそれがどのように役立つかについて懐疑的です...私はそれを試してみましょう...あなたが病気を助けるならば...他の洞察も助けになるまで –

+0

うわー...驚くほど何とか働いた...なぜそれが起こっていたのか理解したいと思います...なぜそれが問題だったのかについての回答を提出してもらえますか? –

答えて

3

を必要としない限り、私は画像を再ロードするか、アイコンをリフレッシュする必要はありません

あなたはelse節では、あなたがnullのIDをチェックelse文を追加する必要が静止画像または任意のプレースホルダを取り込みます。

これは、ImageViewで画像をロードせず、ImageViewがランダム画像を取得した場合に発生します。 if文だけがあるので、if文がfalseのときにImageViewはイメージをロードしません。 Recyclerviewはビューをリサイクルしますが、recyclerviewの行にすべての値を設定する必要があります。それ以外の場合は、以前のイメージ/データが表示されます。

これが役に立ちます。それがあなたの問題を解決したら、それを受け入れます。ありがとう