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可以請您發佈完整的代碼嗎? –