2

Ich bin neu in Android. Ich versuche gerade, eine App mit einem Listenansicht-Bildschirm zu erstellen, auf dem eine Liste mit Büchern angezeigt wird. Für jedes Element gibt es ein von der URL heruntergeladenes Bild und zwei Symbole, deren Bildressource basierend auf den in einem POJO-Objekt eingestellten Werten festgelegt ist.Android RecyclerView Artikel Sequenz Problem

Mein Adapter-Code ist wie folgt:

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> 

Nun ist das Problem kommt, wenn ich über den Bildschirm scrollen. Beim ersten Laden werden die Symbolwerte und Bilder perfekt geladen. Wenn ich aber blättern und zurückkehre, wird der 'onBindViewHolder' erneut aufgerufen und falsche Zufallswerte werden verwendet. Dadurch werden falsche Symbole in den Bildern angezeigt.

kann mir jemand helfen, wie das zu beheben ... ??

ich will nicht die Bilder neu geladen werden oder die Symbole aufgefrischt werden, es sei denn

benötigt
+0

add else statement, wo Sie die ID für null überprüfen, in else-Klausel statische Bilder füllen, hoffe, dies wird Ihnen helfen. –

+0

Ich bin skeptisch, wie das helfen würde ... ich werde es versuchen ... wenn es hilft, dann lass es dich wissen ... bis dahin wäre jede andere Einsicht hilfreich –

+0

Wow ... Erstaunlicherweise hat das irgendwie funktioniert ... ich würde gerne verstehen, warum es passiert ist ... Könnten Sie bitte eine Antwort mit einigen Details einreichen, warum war es ein Problem vor –

Antwort

3

Sie sollten else-Anweisung hinzufügen, in dem Sie die ID für null Überprüfung in else-Klausel füllen statische Bilder oder keine Platzhalter.

Dies passiert, wenn Sie das Bild nicht in ImageView geladen haben und ImageView das zufällige Bild erhalten. In Ihrem Fall haben Sie nur wenn if-Anweisung so ImageView lädt kein Bild, wenn if-Anweisung falsch ist. Recyclerview recycelt die Ansicht, aber wir müssen sicherstellen, dass alle Werte in der Recyclerview-Zeile ausgefüllt werden, ansonsten werden vorherige Bilder/Daten angezeigt.

Hoffe, das hilft. Wenn es dein Problem löst, dann akzeptiere es. Danke