Положение RecyclerView onBindViewHolder не соответствует ожидаемому

Я знаю, что эта проблема неоднократно задавалась в связи с ListViews, однако я никогда не мог по-настоящему понять решение. Я знаю, что параметр позиции onBindViewHolder() в RecyclerViewAdapter аналогичен параметру позиции в listAdapter getView(). Я также знаю, что позиция зависит только от видимых видов. Итак, как я могу загрузить изображение для каждой строки RecyclerView? Изображение может отличаться в зависимости от положения. RecyclerView имеет известное количество строк (57)

Я намерен иметь список массивов «избранных», например, int[] fav = {2,6,30,40}. Итак, если position равно одному из этих элементов, тогда ImageView устанавливает один рисунок, иначе он устанавливает другой. Может ли кто-нибудь помочь мне с этим?

На данный момент позиция повторяется, и многие дополнительные строки устанавливают возможность рисования, зарезервированную для идентификаторов строк в массиве fav.

Благодарю вас,

public class RecyclerViewAdapter extends ...... {

private List<StockItemRow> stockItems;
private Context mContext;
private int[] favourites = {2,3};



RecyclerViewAdapter(Context context, List modelData) {
    if (modelData == null) {
        throw new IllegalArgumentException("modelData must not be null");
    }
    this.stockItems = modelData;
    this.mContext = context;
}


@Override
public ListItemViewHolder onCreateViewHolder(...)
{
    View itemView =     
    LayoutInflater.fromLayoutInflater.
    from(viewGroup.getContext()).
    inflate(R.layout.listitem_row, viewGroup, false);

    return new ListItemViewHolder(itemView);
}


@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onBindViewHolder(ListItemViewHolder viewHolder, int position) {
    StockItemRow stockModel = stockItems.get(position);

    for(int i = 0;i<favourites.length;i++) {
        if (position == favourites[i]) {
             viewHolder.star.setImageResource(R.drawable.star_pressed);

    }
 }

 @Override
 public int getItemCount() {
     return stockItems.size();
 }

public final static class ListItemViewHolder extends....  
   ImageView star;

   public ListItemViewHolder(final View itemView) {
        super(itemView);
        star= (ImageView) itemView.findViewById(R.id.star);
   }
}
}

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

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

    android:dividerHeight="1dip"
    android:layout_width="match_parent">
</android.support.v7.widget.RecyclerView>


</LinearLayout>

person David Gordon    schedule 16.01.2015    source источник
comment
Я не очень понимаю, в чем ваш вопрос. Похоже, ваш код выполняет то, что вы пытаетесь сделать. позиция в onBindViewHolder относится ко всему набору данных, а не только к видимым элементам (точно так же, как в listView)   -  person Shooky    schedule 16.01.2015
comment
Позиция — это фактическая позиция по всему массиву; Не видимое положение.   -  person DeeV    schedule 16.01.2015
comment
drawable star_pressed показывает больше позиций строк, чем две и три   -  person David Gordon    schedule 16.01.2015
comment
9,10,16,17,23,24 и т.д.   -  person David Gordon    schedule 16.01.2015


Ответы (1)


@Deev прав: позиция - это позиция внутри адаптера, а не на экране. Проблема, с которой вы столкнулись, заключается в том, что ваш метод onBindViewHolder() обрабатывает только любимый случай, но не нелюбимый случай. Шаблон ViewHolder используется для повышения эффективности и повторного использования представлений. Измените код следующим образом:

int fav_res = R.drawable.star;
for(int i = 0;i<favourites.length;i++) {
    if (position == favourites[i]) {
        fav_res = R.drawable.star_presed;
        break;
    }
}

viewHolder.star.setImageResource(fav_res);
person Larry Schiefer    schedule 16.01.2015
comment
При этом кажется, что только последний элемент массива избранного имеет 'star_pressed'drawable - person David Gordon; 16.01.2015
comment
Это сделало это. Спасибо. Просто из любопытства был ли ListviewAdapter таким же? его позиция в getView() относится к позиции в адаптере? Я уверен, что раньше у меня были какие-то проблемы с этим, и я думал, что это относится к положению на экране. - person David Gordon; 16.01.2015
comment
Да, позиция, переданная getView() в адаптере ListView, является позицией адаптера. Адаптер не может знать, как сопоставить положение на экране со своим набором данных. Он просто отвечает за знание своего набора данных; представление — это то, что управляет тем, как оно отображается. - person Larry Schiefer; 16.01.2015