2016-03-09 47 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可以请您发布完整的代码吗? –