2016-12-06 7 views
1

Я использую библиотеку this для обработки своих RecycleView для добавления элементов. У меня есть макет с 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 (не все из них):

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

И мой класс 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); 
     } 
    } 
} 

Это работает очень хорошо. Дело в том, что я хотел бы повторно использовать это в другом 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

Я нашел потенциальную ошибку в вашем ViewHolder, хотя я действительно не знаю, как это работает в MainActivity.

Вы установили item_main.xml в вашей getLayoutRes функции и в вашем ViewHolder вы получаете 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); 
    } 
} 

Update

Как вы ошибочно поставили неправильный макет идентификатор в вопросе, так что я думаю, что ошибка не существует. Но в любом случае, я нашел здесь другие проблемы, которые вам нужно проверить.

В вашем 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

Неплохо, я отредактировал некоторые имена/идентификаторы, чтобы упростить их и, казалось, забыл изменить изображение на R.id.cover_image. В моем коде это всегда было так, как будто у вас это есть. Большое спасибо! – user3024750

+0

Хорошо. Соответственно отредактировал вопрос. –

+0

См. Обновленный ответ. –

Смежные вопросы