我在做android项目。我的一个活动具有内部类ChatHistoryAdapter。
当活动开始时,列表将正确显示,但在滚动之后,某些项将被复制。我一直在寻找解决方案,但几乎所有的解决方案都是settag()或inflater。我想我的代码和他们没关系。
所以我真的不明白这里有什么问题…
private class ChatHistoryAdapter extends BaseAdapter {
private LayoutInflater inflater;
public ChatHistoryAdapter( LayoutInflater inflater) {
this.inflater = inflater;
}
public void newOne() {
notifyDataSetChanged();
}
@Override
public int getCount() {
return messages.size();
}
@Override
public Object getItem(int i) {
return messages.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View myView, ViewGroup vg) {
MessageHolder messageHolder;
if (myView == null){
myView = this.inflater.inflate(R.layout.chat_list_item, null, false);
messageHolder = new MessageHolder();
messageHolder.hisTxt = (TextView)myView.findViewById(R.id.hisText);
messageHolder.myTxt = (TextView)myView.findViewById(R.id.myText);
myView.setTag(messageHolder);
} else {
messageHolder = (MessageHolder) myView.getTag();
}
Message mes = messages.get(position);
if (mes.myMessage()){
messageHolder.myTxt.setText(mes.toString());
} else{
messageHolder.hisTxt.setText(mes.toString());
}
return myView;
}
}
private static class MessageHolder{
TextView hisTxt;
TextView myTxt;
}
以下是填写arraylist的部分:
private void loadMessages() {
this.messages = new ArrayList<Message>();
Runnable r = new Runnable() {
@Override
public void run() {
messages = dbMes.gettMessages(guest.getId()); // gettMessages is Synchronized
chatHistoryAdapter = new ChatHistoryAdapter(getLayoutInflater());
listView.setAdapter(chatHistoryAdapter);
}
};
Thread T = new Thread(r);
T.start();
}
最佳答案
如果使用的是viewholder模式,则需要“清除”前面的值。
这样地。
if (mes.myMessage()){
messageHolder.myTxt.setText(mes.toString());
messageHolder.hisTxt.setText("");
} else {
messageHolder.myTxt.setText("");
messageHolder.hisTxt.setText(mes.toString());
}
希望能有所帮助。