2016-09-07 80 views
1

我正在編寫一個消息應用程序,顯示我的和RecyclerView中的其他消息。郵件在回收站視圖中顯示不正確

白色背景消息是Mine消息,彩色消息是其他消息。

當每條消息按順序類似於「我的消息,其他消息...」時,回收站視圖顯示正確。 像下面一樣。 enter image description here

但當消息序列如「其他消息,其他消息,消息」時,回收者視圖顯示爲其他消息,反之亦然。 像下面 enter image description here

我用onBindViewHolder

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) { 
     View v; 
     int width = context.getResources().getDisplayMetrics().widthPixels; 
     LinearLayout.LayoutParams layoutParams; 
     layoutParams = new LinearLayout.LayoutParams((int) (width * 0.75), ViewGroup.LayoutParams.WRAP_CONTENT); 

     if(getItemViewType(i) == MINE){ 
      v = LayoutInflater.from(viewGroup.getContext()) 
        .inflate(R.layout.item_message_view_mine, viewGroup, false); 
      v.setX((float) (width * 0.23)); 
     }else { 
      v = LayoutInflater.from(viewGroup.getContext()) 
        .inflate(R.layout.item_message_view, viewGroup, false); 
      v.setX(0); 
     } 

     layoutParams.setMargins(5, 5, 5, 5); 
     v.setLayoutParams(layoutParams); 

     return new ViewHolder(v); 
    } 


@Override 
    public int getItemViewType(int position) { 
     Log.e("pos", position + ""); 
     try{ 
      if(items.get(position).isResponse()){ 
       return MINE; 
      }else { 
       return OTHERS; 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
      return OTHERS; 
     } 



    } 

@Override 
    public void onBindViewHolder(final ViewHolder viewHolder, int i) { 
     if(getItemViewType(i) == OTHERS){ 
     if(items.get(i).getResponse() != null){ 
      viewHolder.layout.setBackgroundColors(R.color.green_1, R.color.green_2); 
     }else { 
      if(items.get(i).getDate() - System.currentTimeMillis() /1000 > 100){ 
       viewHolder.layout.setBackgroundColors(R.color.red_1, R.color.red_2); 
      }else { 
       viewHolder.layout.setBackgroundColors(R.color.yellow_1, R.color.yellow_2); 
      } 
     } 

    } 

     if(!items.get(i).isResponse()){ 
      if(items.get(i).getResponse() != null){ 
       viewHolder.layout.setBackgroundColors(R.color.green_1, R.color.green_2); 
      }else { 
       int type = General.currentUser.getCurrentRole().getType(); 
       int timeOut = 0; 
       if(type == Role.OPERATOR){ 
        timeOut = General.operatorTimeOut; 
       }else if(type == Role.EXPERT || type == Role.CO_EXPERT){ 
        timeOut = General.expertTimeOut; 
       }else if(type == Role.SENDER){ 
        timeOut = General.senderTimeOut; 
       }else if(type == Role.VERIFIER){ 
        timeOut = General.verifierTimeOut; 
       } 

       if((System.currentTimeMillis()/1000) - items.get(i).getDate() > timeOut){ 
        viewHolder.layout.setBackgroundColors(R.color.red_1, R.color.red_2); 
       }else { 
        viewHolder.layout.setBackgroundColors(R.color.yellow_1, R.color.yellow_2); 
       } 
      } 
     }else { 
      viewHolder.layout.setBackgroundColors(R.color.white, R.color.grey); 
     } 

     if(items.get(i).getType() == Message.TYPE_VOICE && items.get(i).getVoice() != null){ 
      viewHolder.layoutVoice.setVisibility(View.VISIBLE); 
      viewHolder.tvText.setVisibility(View.GONE); 
      //if(items.get(i).getVoice().get) 
      File voice = new File(context.getCacheDir().getAbsolutePath() + "/" + items.get(i).getVoice().getId()); 
      if(voice.exists()){ 
       viewHolder.playerView.setVisibility(View.VISIBLE); 
       viewHolder.ivVoice.setVisibility(View.GONE); 
       if(playerItem != -1){ 
        if(playerItem == i){ 
         viewHolder.playerView.startAnimation((int) items.get(i).getVoice().getLength(), new PlayerView.PlayerViewListener() { 
          @Override 
          public void onPlayerFinished() { 

          } 
         }); 
        }else { 
         viewHolder.playerView.stopAnimation(); 
        } 
       } 
      }else { 
       viewHolder.playerView.setVisibility(View.GONE); 
       viewHolder.ivVoice.setVisibility(View.VISIBLE); 
      } 

      viewHolder.tvVoiceVolume.setText((items.get(i).getVoice().getVolume()/1024) + " KB"); 
      viewHolder.tvVoiceLength.setText((items.get(i).getVoice().getLength() /60) + ":" + (items.get(i).getVoice().getLength() %60) + " s"); 


     }else { 
      viewHolder.layoutVoice.setVisibility(View.GONE); 
      viewHolder.tvText.setVisibility(View.VISIBLE); 
      viewHolder.tvText.setText(items.get(i).getText()); 
     } 

     if(items.get(i).isResponse()){ 
      viewHolder.ivSent.setVisibility(View.VISIBLE); 
      if(items.get(i).getSendStatus() == Message.SENT){ 
       viewHolder.ivSent.setImageResource(R.drawable.ic_check_black_24dp); 
       viewHolder.ivSent.setColorFilter(ContextCompat.getColor(context, android.R.color.holo_green_dark)); 
      }else if(items.get(i).getSendStatus() == Message.SENDING) { 
       viewHolder.ivSent.setImageResource(R.drawable.ic_query_builder_black_24dp); 
       viewHolder.ivSent.setColorFilter(Color.GRAY); 
      }else if(items.get(i).getSendStatus() == Message.FAILED){ 
       viewHolder.ivSent.setImageResource(R.drawable.ic_error_black_24dp); 
       viewHolder.ivSent.setColorFilter(Color.RED); 
      } 
     }else { 
      if(items.get(i).getUnder_user_role_process1() > 0){ 
       viewHolder.ivSent.setVisibility(View.VISIBLE); 
       viewHolder.ivSent.setImageResource(R.drawable.ic_verified_user_black_24dp); 
       viewHolder.ivSent.setColorFilter(ContextCompat.getColor(context, android.R.color.holo_green_dark)); 
      }else { 
       viewHolder.ivSent.setVisibility(View.INVISIBLE); 
      } 
     } 



     Date date = new Date(items.get(i).getDate() * 1000L); // *1000 is to convert seconds to milliseconds 
     SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm", Locale.ENGLISH); // the format of your date 
     sdf.setTimeZone(TimeZone.getTimeZone("GMT-4:30")); // give a timezone reference for formatting (see comment at the bottom 
     String formattedDate = sdf.format(date); 

     viewHolder.tvDate.setText(formattedDate); 

    } 

有什麼問題,這個代碼?

+0

add onBindViewHolder太 –

+0

@VladMatvienko我加了 – Ali

回答

1

我解決了問題。 onCreateViewHolder的第二個參數是viewType不是一個位置。 因此onCreateViewHolder中的i是viewType。所以我把if(getItemViewType(i) == MINE)更改爲if(i == MINE)之後,一切都沒有了。

1

我首先想到用戶沒有像「UserID」那麼當你在第2行中輸入2條消息會得到像每條消息一樣的錯誤。爲什麼你使用recyclerView?不是更好的是創建一個像「滾動視圖」的佈局,併爲此添加一個視圖(消息)?

private long createRandomId() { 
    char[] chars = "123456789".toCharArray(); 
    StringBuilder sb = new StringBuilder(); 
    Random random = new Random(); 
    for (int i = 0; i < 10; i++) { 
     char c = chars[random.nextInt(chars.length)]; 
     sb.append(c); 
    } 
    return Long.parseLong(sb.toString()); 
} 
+1

RecyclerView比其他方式更好。但是,當我覺得應該使用它,所以我會用它 – Ali

+0

如你所願,如果你需要幫助,我會幫助你與我自己的聊天,我創建使用scrollView,也見編輯後創建一個randomId用戶 – Rodriquez

+0

我解決了問題,看我的回答 – Ali

0

我也遇到這個問題先生,但我使用單獨的視圖持有人解決它。

@Override 
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view; 
    UserViewHolder holder = null ; 
    int layoutRes = 0; 
    switch (viewType) { 
     case CURRENT_USER_VIEW: 
      layoutRes = R.layout.current_user_view_model; 
      view = inflater.inflate(layoutRes, parent, false); 
      holder = new CurrentUserHolder(view); 
      break; 
     case OTHER_USER_VIEW: 
      layoutRes = R.layout.sender_user_view_model; 
      view = inflater.inflate(layoutRes, parent, false); 
      holder = new SenderUserHolder(view); 
      break; 
    } 

    return holder; 
} 

public abstract class UserViewHolder extends RecyclerView.ViewHolder{ 
    public UserViewHolder(View itemView) { 
     super(itemView); 
    } 
} 

public class SenderUserHolder extends UserViewHolder{ 
    public TextView message; 
    public TextView dateSent; 
    public ImageView senderImage; 
    public final View mView; 
    public View contSender; 

    public SenderUserHolder(View itemView) { 
     super(itemView); 
     mView = itemView; 
     contSender = itemView.findViewById(R.id.cont_sender); 
     message = (TextView)mView.findViewById(R.id.tv_message); 
     dateSent = (TextView)mView.findViewById(R.id.tv_send_date); 
     senderImage = (ImageView)mView.findViewById(R.id.iv_send_image); 
    } 
} 

public class CurrentUserHolder extends UserViewHolder{ 
    public TextView message; 
    public TextView dateSent; 
    public final View mView; 
    public View cont;; 

    public CurrentUserHolder(View itemView) { 
     super(itemView); 

     mView = itemView; 
     cont = mView.findViewById(R.id.cont_current); 
     message = (TextView)mView.findViewById(R.id.tv_message); 
     dateSent = (TextView)mView.findViewById(R.id.tv_send_date); 
    } 
} 
+0

我解決了問題,看我的答案 – Ali