0
我有RecycleView
和RecycleViewAdapter
,一切工作正常与单一类型的行,然后我添加了一个新的行(所以现在我有2种行),列表开始行为以一种奇怪的方式。RecycleView与多种类型的子视图
只要显示列表的行是正确的,然后我开始向列表中添加元素,我期望第一种行,但应用程序显示第二种行,有时它可以工作,其他时间我期望第二种和应用程序播下我的第一种。
滚动列表有时会随机更改行的类型。
看着日志和使用调试器一切看起来很好。
什么建议吗?
这是代码的一部分:
完整代码:
public class ChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter {
private Context context;
private Fragment fragment;
private List<Message> messages;
private boolean isMine;
private int sent_imageRowResId = R.layout.row_messages_image_sent;
private int sent_videoRowResId = R.layout.row_messages_video_sent;
private int sent_audioRowResId = R.layout.row_messages_audio_sent;
private int sent_textRowResId = R.layout.row_messages_text_sent;
private int recv_imageRowResId = R.layout.row_messages_image_recv;
private int recv_videoRowResId = R.layout.row_messages_video_recv;
private int recv_audioRowResId = R.layout.row_messages_audio_recv;
private int recv_textRowResId = R.layout.row_messages_text_recv;
private static final int TEXT = 1;
private static final int VIDEO = 2;
private static final int IMAGE = 3;
private static final int AUDIO = 4;
public ChatAdapter(Context context, List<Message> messages, Fragment fragment) {
this.fragment = fragment;
this.context = context;
this.messages = messages;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
Message message = messages.get(position);
String senderAccountIdentifier = message.getSenderAccountIdentifier();
isMine = senderAccountIdentifier.equals(userAccountIdentifier);
int viewType = TEXT;
if (message instanceof TextMessage) viewType = TEXT;
else if (message instanceof VideoMessage) viewType = VIDEO;
else if (message instanceof ImageMessage)viewType = IMAGE;
else if (message instanceof AudioMessage) viewType = AUDIO;
if (viewType == IMAGE) {
View view = LayoutInflater.from(parent.getContext()).inflate(isMine ? sent_imageRowResId : recv_imageRowResId, parent, false);
ViewHolderImage viewHolder = new ViewHolderImage(view);
return viewHolder;
} else if (viewType == VIDEO) {
View view = LayoutInflater.from(parent.getContext()).inflate(isMine ? sent_videoRowResId : recv_videoRowResId, parent, false);
ViewHolderVideo viewHolder = new ViewHolderVideo(view);
return viewHolder;
} else if (viewType == AUDIO) {
View view = LayoutInflater.from(parent.getContext()).inflate(isMine ? sent_audioRowResId : recv_audioRowResId, parent, false);
ViewHolderAudio viewHolder = new ViewHolderAudio(view);
return viewHolder;
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(isMine ? sent_textRowResId : recv_textRowResId, parent, false);
ViewHolderText viewHolder = new ViewHolderText(view);
return viewHolder;
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof BaseViewHolder) {
final Message message = messages.get(position);
final BaseViewHolder bvh = (BaseViewHolder) holder;
bvh.dateTextView.setText(getDateString(position));
bvh.senderTextView.setVisibility(View.GONE);
bvh.rowMessage.setActivated(selectedItems.get(position, false));
if (bvh instanceof ViewHolderText) {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
ViewHolderText viewHolderText = (ViewHolderText) bvh;
viewHolderText.init(textMessage);
}
}
}
}
@Override
public int getItemCount() {
return messages.size();
}
EDIT
更新与几乎完整代码
与此2行的差(我只使用文本之一)只是文本的颜色和布局引力
编辑 - 解决
改变getItemViewType()
回归已经解决了这个问题,我已经取代return viewType
与return position
,我已经搬到里面onCreateViewHolder一些逻辑。
这看起来像我的代码,并使用此代码我有问题 – frenk91
@ frenk91我无法看到“getViewTypeCount()”或“getItemViewType”在你的代码 - 这些是什么决定多个视图,不同的视图类型。 – Zain
@ frenk91可以请您发布完整的代码吗? –