2015-02-15 3 views
2

У меня есть RecyclerView, где каждый элемент списка имеет ImageButton, ты образ которого я определяю в onBindViewHolder адаптера() (?):RecyclerView продолжает повторять кэшированные подвид и не смотря на onBindViewHolder

int myVote = getMyVote(); 
    if (myVote != 0) { 
     Log.d("dbg", myVote + ""); 
     holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp); 
    } 

Так ratingButton является звезда в правом нижнем углу макета списка. Его форма заполнена серым цветом (и, соответственно, записывается запись журнала), если условие (myVote! = 0) выполнено.

Проблема в том, что когда я просматриваю список вниз, я могу наблюдать, как другие звезды заполнились, хотя я вижу единственную запись в окне журнала (для правильного элемента списка). Более того, эти элементы списка с неправильно измененными кнопками повторяются каждые 5 строк, и это меня пугает. Если я изменю

mListView.setItemViewCacheSize(0);
, период повторения изменится на 3, поэтому мы можем предположить, что он каким-то образом связан с механизмом кэширования и рециркуляции RecyclerView.

Пожалуйста, помогите мне решить проблему. Благодаря!

+4

Вы показываете блок 'if' для теста' myVote! = 0'. Вставьте блок 'else', где вы вызываете' setImageResource() 'для другого значения. И если у вас нет такого блока 'else', это будет вашей проблемой. – CommonsWare

+0

Внесите оба метода getItemId() и getItemViewType(), как предлагается [здесь] (http://stackoverflow.com/questions/33316837/how-to-prevent-items-from-getting-duplicated-when-scrolling-recycler-view) – Tiger

ответ

5

Попробуйте изменить код:

if (myVote != 0) { 
     Log.d("dbg", myVote + ""); 
     holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp); 
    } else { 
     holder.ratingButton.setImageResource(int another resource); 
    } 
} 
+0

Спасибо, это помогло! – sonderlain

9

Не забудьте осуществить

public long getItemId(int position) {} 

в противном случае, вы увидите повторяющиеся элементы в RecyclerView.

+0

@Viliusk ... Удивительный! – Abhilash

+0

getItemId реализация кажется бесполезной для этой проблемы – Sever

2

Вы можете также написать else часть основного состояния с some another resource как:

if (myVote != 0) { 
    Log.d("dbg", myVote + ""); 
    holder.ratingButton.setImageResource(R.drawable.ic_star_grey600_36dp); 
} else { 
    holder.ratingButton.setImageResource(int another_resource); 
} 

Он работал для меня.