2016-12-06 3 views
1

Ich verwende this Bibliothek, um meine RecycleView zu behandeln, um Elemente hinzuzufügen. Ich habe ein Layout mit einer ImageView und einer Klasse. Ich habe eine Liste mit einem Objekt und möchte diese zur RecycleView hinzufügen.Recycleviewer - Wie wird das Layout wiederverwendet?

Also im Grunde wie folgt aus:

Mein item_main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/frame" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true"> 

    <ImageView 
     android:id="@+id/cover_image" 
     android:layout_width="180dp" 
     android:layout_height="264dp" 
     android:scaleType="centerCrop" /> 

</FrameLayout> 

Mein activity_main.xml (alle nicht):

<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/swipe_refresh_main" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 

     android:scrollbars="vertical"/> 
</android.support.v4.widget.SwipeRefreshLayout> 

Und meine Klasse MyObject:

public class MyObject extends AbstractItem<MyObject, MyObject.ViewHolder> implements Serializable { 
    @SerializedName(value="id") 
    private int id; 
    @SerializedName(value="name") 
    private String name; 
    @Expose 
    private String linkToImage; 

    public int getId() { 
     return id; 
    } 
    public String getName() { 
     return name; 
    } 

    @Override 
    public int getType() { 
     return R.id.image; 
    } 

    //The layout to be used for this type of item 
    @Override 
    public int getLayoutRes() { 
     return R.layout.item_main; 
    } 

    @Override 
    public void bindView(ViewHolder viewHolder, List<Object> payloads) { 
     //call super so the selection is already handled for you 
     super.bindView(viewHolder, payloads); 

     //bind our data 
     //set the text for the name 
     Picasso.with(viewHolder.itemView.getContext()) 
       .load(linkToImage) 
       .into(viewHolder.image); 
    } 

    //The viewHolder used for this item. This viewHolder is always reused by the RecyclerView so scrolling is blazing fast 
    protected static class ViewHolder extends RecyclerView.ViewHolder { 
     protected ImageView image; 
     public ViewHolder(View view) { 
      super(view); 
      this.image = (ImageView) view.findViewById(R.id.cover_image); 
     } 
    } 
} 

Das funktioniert sehr gut. Die Sache ist jetzt, dass ich diese in einer anderen Activity mit einer anderen RecycleView aber derselben List<MyObject> und derselben item_main.xml wiederverwenden möchte.

Ich habe versucht, den gleichen Code zu verwenden, den ich in MainActivity habe. Es scheint die Elemente hinzuzufügen (es gibt den Namen in onClick aus) aber es lädt die Bilder nicht.

Hier ist mein Code in der MainActivity:

RecyclerView mRecyclerView; 
mRecyclerView = (RecyclerView) findViewById(R.id.mainRecycleView); 
mRecyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2)); 

FastItemAdapter fastAdapter = new FastItemAdapter(); 

mRecyclerView.setAdapter(fastAdapter); 
fastAdapter.add(listOfMyObjects); 
DefaultItemAnimator animator = new DefaultItemAnimator() { 
    @Override 
    public boolean canReuseUpdatedViewHolder(RecyclerView.ViewHolder viewHolder) { 
     return true; 
    } 
}; 
fastAdapter.withSelectable(true); 
fastAdapter.withOnClickListener(new FastAdapter.OnClickListener<MyObject>() { 
    @Override 
    public boolean onClick(View v, IAdapter<MyObject> adapter, MyObjectitem, int position) { 
     Log.d("DEBUG", item.getName()); 
     return true; 
    } 
}); 
mRecyclerView.setItemAnimator(animator); 

Irgendwelche Ideen? Vielen Dank.

+0

Gibt es einen Fehler in Logcat? –

+0

@ReazMurshed - nein, es startet die Aktivität normalerweise, lädt die Daten (Die Liste ) und lädt sogar in den RecycleView, es zeigt nur nicht das Bild – user3024750

+0

Bitte lesen Sie die Antwort unten. Hier ist ein potenzieller Fehler. –

Antwort

1

Ich habe einen möglichen Fehler in Ihrem ViewHolder gefunden, obwohl ich wirklich nicht weiß, wie es in MainActivity funktioniert.

Sie festgelegt haben item_main.xml in Ihrer getLayoutRes Funktion und in Ihrem ViewHolder Sie zur ImageView Referenz von falscher Layout-ID.

So sollte Ihr ViewHolder so aussehen.

protected static class ViewHolder extends RecyclerView.ViewHolder { 
    protected ImageView image; 
    public ViewHolder(View view) { 
     super(view); 

     // Set the proper layout id cover_image here 
     this.image = (ImageView) view.findViewById(R.id.cover_image); 
    } 
} 

aktualisieren

Wie Sie versehentlich die falsche Layout-ID in die Frage gestellt habe, so glaube ich, der Fehler ist nicht da. Aber irgendwie habe ich hier andere Probleme gefunden, die Sie überprüfen müssen.

In Ihrer MainActivity setzen Sie den Adapter zuerst und dann fügen Sie Objekte in Ihrem Adapter hinzu. So könnte tun Sie das

// Add the items first 
fastAdapter.add(listOfMyObjects); 

// Then set the adapter 
mRecyclerView.setAdapter(fastAdapter); 

Oder Sie können in Ihrem Weg, dies zu tun

mRecyclerView.setAdapter(fastAdapter); 
fastAdapter.add(listOfMyObjects); 

// Notify the adapter that new elements have added 
fastAdapter.notifyDatasetChanged(); 

Und bitte prüfen, ob die Bild-Links gültig sind.

Persönlich verwende ich Glide zum Laden von Bildern. Sie können sich Glide auch für das Laden von Bildern ansehen.

Glide.with(viewHolder.itemView.getContext()) 
    .load(linkToImage) 
    .into(viewHolder.image); 
+0

Meine schlechte, ich habe einige Namen/IDs bearbeitet, um es einfacher zu machen und schien zu vergessen, das Bild in R.id.cover_image zu ändern. In meinem Code war es immer so, wie du es hast. Vielen Dank! – user3024750

+0

Okay. Bearbeitet die Frage entsprechend. –

+0

Bitte beachten Sie die aktualisierte Antwort. –

Verwandte Themen