2016-12-06 2 views
1

私はRecycleViewを処理するためにthisライブラリを使用しています。私はImageViewとクラスを持つレイアウトを持っています。私はオブジェクトのリストを持っており、それらをRecycleViewに追加したいと思います。だから、基本的にこのようなRecycleviewer - レイアウトを再利用するには?

マイ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> 

マイactivity_main.xml(ではない、それのすべて):MyObject

<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> 

そして、私のクラス:

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); 
     } 
    } 
} 

それはとてもうまく動作します。今度は別のActivityで別のRecycleViewを使って再利用したいが、同じList<MyObject>と同じitem_main.xmlと同じものを再利用したいということです。

私はMainActivityと同じコードを使用しようとしました。アイテムを追加するように見えます(名前はonClickに印刷されます)が、イメージはロードされません。

ここに私のコードは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); 

任意のアイデア?ありがとう。

+0

logcatにエラーが発生しますか? –

+0

@ReazMurshed - いいえ、それは正常に活動を開始し、データ(リスト)を読み込み、さらにそれをRecycleViewにロードします。画像は表示されません – user3024750

+0

下記の答えをご覧ください。ここに潜在的なバグがあります。 –

答えて

1

私は実際にはMainActivityでどのように動作するのかわかりませんが、あなたのViewHolderに潜在的なバグを発見しました。

あなたgetLayoutRes機能にitem_main.xmlを設定したし、あなたのViewHolderに間違ったレイアウトIDからImageViewの参照を取得しています。

あなたのViewHolderはこのように見えます。

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); 
    } 
} 

更新

誤っ質問に間違ったレイアウトIDを入れているので、私はバグが存在しないと思うのよう。しかし、とにかく、私はあなたがチェックする必要があるかもしれない他の問題をここで見つけました。

MainActivityでは、まずアダプタを設定してからアダプタにオブジェクトを追加します。だから、この

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

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

を行う可能性がありますまたはあなたの道

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

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

でこれを行うことができますし、画像リンクが有効であるかどうかを確認してください。

個人的には、画像を読み込むためにGlideを使用します。イメージの読み込みにもGlideを使用することがあります。

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

私は悪いですが、簡単にするためにいくつかの名前/ IDを編集し、画像をR.id.cover_imageに変更することを忘れてしまったようです。私のコードでは、いつものようになっています。おかげでたくさん! – user3024750

+0

それに応じて質問を編集しました。 –

+0

更新された回答をご覧ください。 –

関連する問題