2016-03-09 4 views
3

У меня есть пользовательский адаптер Recycle View, который перечисляет мои элементы. в каждом элементе я проверяю базу данных и рисую несколько кругов с цветами.Данные адаптера RecycleView показывают неправильную прокрутку слишком быстро

, когда я прокручиваю список очень быстро, все полученные данные (не название и текст) показывают ошибки! Как я могу управлять динамическим представлением вида без отображения неправильных данных ?!

@Override 
    public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) { 
     itemViewHolder.date.setText(items.get(i).getData()); // set the title 

     itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with 

} 

и это importMenuTags():

private RelativeLayout generateTagImages(String serverId) { 

     List<String> color_list = new ArrayList<>(); 
    RelativeLayout result = new RelativeLayout(context); 
    List<String> list = db.getCardTags(serverId); 

     int i = 0; 
     for (String string : list) { 
      RelativeLayout rl = new RelativeLayout(context); 
      color_list.add(get_the_proper_color); 
      Drawable drawable = context.getResources().getDrawable(R.drawable.color_shape); 
      drawable.setColorFilter(Color.parseColor(dao.getTagColor(string)), PorterDuff.Mode.SRC_ATOP); 
      RelativeLayout.LayoutParams lparams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
      lparams.addRule(RelativeLayout.ALIGN_PARENT_START); 
      lparams.setMargins(i, 0, 0, 0); 
      lparams.width = 35; 
      lparams.height = 35; 
      rl.setLayoutParams(lparams); 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       rl.setBackground(drawable); 
      } else { 
       rl.setBackgroundDrawable(drawable); 
      } 

      result.addView(rl); 
      i = i + 25; 

     } 


    return result; 
} 

я была такая же проблема в простой пользовательский адаптер, это решается путем перемещения моей функции место из

if (convertView == null) {

это link.

ответ

3

Как видно из вашего кода, я обнаружил, что ваш относительный макет должен показывать дополнительные данные во время прокрутки. И это из-за рециркуляции взглядов. Здесь

public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) { 
      itemViewHolder.date.setText(items.get(i).getData()); // set the title 

      itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with 
//Problem is here. 

Предположим, что вы добавили некоторые дочерние представления в выше holde.relative_layout, и это ViewHodler является recyclerd и при условии, другой точке зрения пункт, это уже все ранее добавлены взгляды в нем. и вы добавляете с ними новый вид детства. Надеюсь, вы понимаете свою проблему.

Решение: Очень простой. удалить все previsousley добавленного вида в onBindViewHolder

public void onBindViewHolder(final ItemViewHolder itemViewHolder, int i) { 
      itemViewHolder.date.setText(items.get(i).getData()); // set the title 

    itemViewHolder.relative_layout_tag_place.removeAllViews(); 
    itemViewHolder.relative_layout_tag_place.addView(generateTagImages(items.get(i).getServerId())); // had to generate a Relativelaout with 
1

Я нашел это решение после 3 дней ... надеюсь, что это будет работать для вас.

У меня была та же проблема, и единственное решение, которое я нашел для этого:

holder.setIsRecyclable(false); 

Ваш переработчик не будет перерабатывать больше, так что элементы будут такими же, когда вы крутите, и если вы хотите удалить некоторые item не использовать notifyitemRemoved (позиция), используйте notifyDataSetChanged() вместо этого.

+3

Я думаю, что это нехорошо, потому что мы используем переработку в точности, чтобы переработать наши представления и улучшить управление памятью. спасибо за ответ, но проверьте @Mahendra Ответ, и я думаю, вам нужно было сделать вот так. – Kenji

+0

Я уже пробовал, но не работал в моем потоке .. так что это сработало –

+0

работал для меня, но если у нас есть большой список, то это не очень хороший вариант для управления памятью. но ведь хороший ответ – user3530687

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