2016-03-09 50 views
0

我有RecycleViewRecycleViewAdapter,一切工作正常與單一類型的行,然後我添加了一個新的行(所以現在我有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 viewTypereturn position,我已經搬到裏面onCreateViewHolder一些邏輯。

回答

4

採用這種做法

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    class ViewHolder1 extends RecyclerView.ViewHolder { 
     ... 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
    switch(getItemViewType(position)){ 
     case 1: // put your values in the view 
     case 2: // put your values in the view 
    } 


    class ViewHolder2 extends RecyclerView.ViewHolder { 
     ... 
    } 

    @Override 
    public int getItemViewType(int position) { 
     // for your different positions, return different numbers say 1, 2 these numbers will signify your view types 
     return position viewType; 
    } 

    public int getViewTypeCount(){ 
     return 2; 
    } 


    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 1: // handle your viewholder 1 
      case 2: //handle your viewholder 2 
     } 
    } 
} 
+0

這看起來像我的代碼,並使用此代碼我有問題 – frenk91

+0

@ frenk91我無法看到「getViewTypeCount()」或「getItemViewType」在你的代碼 - 這些是什麼決定多個視圖,不同的視圖類型。 – Zain

+0

@ frenk91可以請您發佈完整的代碼嗎? –