2016-04-13 2 views
1

У меня есть RecyclerView, содержащий элементы с интерактивным контентом. Каждый элемент содержит текстовое представление, которое обновляется каждые 5 секунд, но когда в RecyclerView содержится более 5 элементов, данные смешиваются.Содержимое содержимого RecyclerView перемещается

К примеру:

Правильно: | 1 - 100 |

| 2 - 283 |

| 3 - 382 |

При смешивании:

| 2 - 283 |

| 1 - 100 |

| 3 - 382 |

Это похоже на то, что это просто путается.

Это происходит, когда я вызываю адаптер.notifyDataSetChanged();

Мой адаптер:

общественного класса FavoritesAdapter расширяет RecyclerView.Adapter {

private List<Favorites> channels; 
private Context context; 

public FavoritesAdapter(Context context, List<Favorites> channels) { 
    this.context = context; 
    this.channels = channels; 
} 

@Override 
public FavoritesViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.favoriteitem_layout, viewGroup, false); 
    FavoritesViewHolder pvh = new FavoritesViewHolder(v); 
    return pvh; 
} 

@Override 
public void onBindViewHolder(final FavoritesViewHolder holder, final int position) { 
    final DBHelper dbHelper = new DBHelper(context); 
    if (Data.isConnected(context)) { 
     Scheduler.getInstance().doAsync(new Scheduler.Task<Object, Channel>() { 
      @Override 
      public Channel run(Object... params) { 
       return Methods.getData(channels.get(position).getChannelId(), channels.get(position).getChannelName(), true, context); 
      } 
     }, new Scheduler.Executable<Channel>() { 
      @Override 
      public void execute(Channel result) { 

       if(result.getId() != "") { 
        if(!result.channelSubs.equalsIgnoreCase("-500_RTSS_ERROR")) { 
         holder.channelSubsView.setText(result.getSubs()); 
         holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers"); 
         channels.get(position).setChannelSubs(result.getSubs()); 
         dbHelper.updateFavorites(channels.get(position)); 
        } 
        else { 
         holder.channelSubsView.setText(channels.get(position).getChannelSubs()); 
         holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers (Cached)"); 
        } 
       } 
       else { 
        holder.channelSubsView.setText(channels.get(position).getChannelSubs()); 
        holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers (Cached)"); 
       } 
      } 
     }); 
    } 
    else { 
     holder.channelSubsView.setText(channels.get(position).getChannelSubs()); 
     holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers (Cached)"); 
    } 

    Picasso.with(context).load(channels.get(position).getChannelAvatar()) 
      .error(R.drawable.youtube_default_avatar) 
      .placeholder(R.drawable.youtube_default_avatar) 
      .into(holder.channelAvatarView); 

    holder.channelCardView.setOnClickListener(clickListener); 
    holder.channelCardView.setTag(holder); 
} 

View.OnClickListener clickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     FavoritesViewHolder holder = (FavoritesViewHolder) view.getTag(); 
     int position = holder.getPosition(); 

     Favorites channel = channels.get(position); 
     if(Data.isConnected(context)) { 
      Methods.getYouTubeData(channel.getChannelId(), channel.getChannelName(), channel.getChannelAvatar(), context); 
     } 
     else { 
      Toast.makeText(context, R.string.error_connection_no_internet, Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 

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

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 

public static class FavoritesViewHolder extends RecyclerView.ViewHolder { 
    CardView channelCardView; 
    TextView channelSubsView; 
    TextView channelTitleSubsView; 
    ImageView channelAvatarView; 

    FavoritesViewHolder(View itemView) { 
     super(itemView); 
     channelCardView = (CardView) itemView.findViewById(R.id.channelCardView); 
     channelSubsView = (TextView) itemView.findViewById(R.id.subsAmount); 
     channelTitleSubsView = (TextView) itemView.findViewById(R.id.subsText); 
     channelAvatarView = (ImageView) itemView.findViewById(R.id.channelAvatarView); 
    } 
} 

}

+0

почта какой-либо код .. –

+0

запись адаптор класс пожалуйста – Jeffalee

+0

@RohitArya сделано! –

ответ

0

Вы можете проверить, если вы редактируете заказ/сортировки исходного списка, переданного конструктору адаптера.

List<Favorites> channels = getChannels(); 
adapter = new FavoritesAdapter(context, channels); 
recyclerView.setAdapter(adapter) 
//  edit or sort *channels* 
adapter.notifyDataSetChanged(); 
0

Вы делаете asynchronous вызов в onBindViewHolder так, когда реакция задач асинхронных приходит, он читает неправильно позиции из public void onBindViewHolder(final FavoritesViewHolder holder, final int position) потому что к этому времени положение возвращенного onBindViewHolder имеет изменил.

Что вы можете сделать, передайте позицию в async task в качестве параметра и доставьте то же положение в результате async task. Таким образом, вызов, сделанный для позиции p (скажем), будет применен к p.

Наряду с этим попробуйте использовать getAdapterPosition вместо getPosition (устарел и создает путаницу) на RecyclerViewHolder.

+0

Не работает, я запишу видео, чтобы показать вам, как это выглядит. –

+0

обновите код, как вы это делаете. –

+0

Вот видео, чтобы посмотреть, что происходит: https://youtu.be/9KU2iKtMPCE Я обновлю код как можно скорее. –

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