2015-05-29 70 views
-1

我正面臨一個問題。 我正在使用QuickBlox私人聊天。我只想顯示日期和時間,只顯示發送和獲取的最後一條消息。我實現了這一點,但問題是,當我滾動該消息列表視圖日期和時間變化的位置和每一個滾動顯示與其他消息不與最後一次。我該如何解決這個問題? 我的BaseAdapter代碼如下。Android,Listview on Scroll項目位置問題

public class ChatAdapter extends BaseAdapter { 

private final List<QBChatMessage> chatMessages; 
private Activity context; 
private static String inComingMessage = "0"; 
private static String outGoingMessage = "0"; 

public ChatAdapter(Activity context, List<QBChatMessage> chatMessages, 
     String inComingMessage, String outGoingMessage) { 
    this.context = context; 
    this.chatMessages = chatMessages; 
    this.inComingMessage = inComingMessage; 
    this.outGoingMessage = outGoingMessage; 
} 

@Override 
public int getCount() { 
    if (chatMessages != null) { 
     return chatMessages.size(); 
    } else { 
     return 0; 
    } 
} 

@Override 
public QBChatMessage getItem(int position) { 
    if (chatMessages != null) { 
     return chatMessages.get(position); 
    } else { 
     return null; 
    } 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    QBChatMessage chatMessage = getItem(position); 
    LayoutInflater vi = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 
     convertView = vi.inflate(R.layout.list_item_message, null); 
     holder = createViewHolder(convertView); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    QBUser currentUser = ((ApplicationSingleton) context.getApplication()) 
      .getCurrentUser(); 
    boolean isOutgoing = chatMessage.getSenderId() == null 
      || chatMessage.getSenderId().equals(currentUser.getId()); 
    setAlignment(holder, isOutgoing); 
    holder.txtMessage.setText(chatMessage.getBody()); 
    if (chatMessage.getSenderId() != null) { 
     if (chatMessage.getSenderId().equals(currentUser.getId())) { 
      if (outGoingMessage.equals("1")) { 
       if (chatMessage.isRead()) { 
        holder.txtDateTime 
          .setText("Seen: " 
            + convertDate(chatMessage.getDateSent() * 1000)); 
       } else { 
        holder.txtDateTime.setText(convertDate(chatMessage 
          .getDateSent() * 1000)); 
       } 
       outGoingMessage = "0"; 
      } 
     } else { 
      if (inComingMessage.equals("1")) { 
       holder.txtDateTime.setText("Seen: " 
         + convertDate(chatMessage.getDateSent() * 1000)); 
       inComingMessage = "0"; 
      } 
     } 
    } else { 
     holder.txtDateTime 
       .setText(convertDate(chatMessage.getDateSent() * 1000)); 
    } 

    return convertView; 
} 

public void add(QBChatMessage message) { 
    chatMessages.add(message); 
} 

public void add(List<QBChatMessage> messages) { 
    chatMessages.addAll(messages); 
} 

private void setAlignment(ViewHolder holder, boolean isOutgoing) { 
    if (!isOutgoing) { 
     holder.contentWithBG 
       .setBackgroundColor(Color.parseColor("#00aeef")); 

     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG 
       .getLayoutParams(); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.contentWithBG.setLayoutParams(layoutParams); 

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content 
       .getLayoutParams(); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     holder.content.setLayoutParams(lp); 
     layoutParams = (LinearLayout.LayoutParams) holder.txtMessage 
       .getLayoutParams(); 
     layoutParams.setMargins(0, 10, 20, 0); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.txtMessage.setLayoutParams(layoutParams); 

     layoutParams = (LinearLayout.LayoutParams) holder.txtDateTime 
       .getLayoutParams(); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.txtDateTime.setLayoutParams(layoutParams); 
    } else { 
     holder.contentWithBG 
       .setBackgroundColor(Color.parseColor("#F5F5F5")); 

     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG 
       .getLayoutParams(); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.contentWithBG.setLayoutParams(layoutParams); 

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content 
       .getLayoutParams(); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     holder.content.setLayoutParams(lp); 
     layoutParams = (LinearLayout.LayoutParams) holder.txtMessage 
       .getLayoutParams(); 
     layoutParams.setMargins(0, 10, 20, 0); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.txtMessage.setLayoutParams(layoutParams); 

     layoutParams = (LinearLayout.LayoutParams) holder.txtDateTime 
       .getLayoutParams(); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.txtDateTime.setLayoutParams(layoutParams); 
    } 
} 

private ViewHolder createViewHolder(View v) { 
    ViewHolder holder = new ViewHolder(); 
    holder.txtMessage = (TextView) v.findViewById(R.id.txtMessage); 
    holder.content = (LinearLayout) v.findViewById(R.id.content); 
    holder.contentWithBG = (LinearLayout) v 
      .findViewById(R.id.contentWithBackground); 
    holder.txtDateTime = (TextView) v.findViewById(R.id.txtDateTime); 
    return holder; 
} 

public static String convertDate(long dateInMilliseconds) { 
    return DateFormat.format("hh:mm", (dateInMilliseconds)).toString(); 
} 

private static class ViewHolder { 
    public TextView txtMessage; 
    public TextView txtDateTime; 
    public LinearLayout content; 
    public LinearLayout contentWithBG; 
} 
} 

回答

1

無論何時加載列表視圖,您都需要考慮所有場景。我的意思是,如果你設置textview文本使用條件,你必須寫其他條件,並需要爲該文本視圖編寫操作。如果你不考慮其他部分,那麼你有這個問題。當您滾動的數據發生變化時。

在你的情況是使用下面的代碼

if (inComingMessage.equals("1")) { 
       holder.txtDateTime.setText("Seen: " 
         + convertDate(chatMessage.getDateSent() * 1000)); 
       inComingMessage = "0"; 
      } 

但這裏沒有別的部分。所以,如果這個條件失敗,數據將會改變。所以寫下你的其他部分。

這是一種情況。嘗試這個。