I'm working on Android project. one of my activities has inner class ChatHistoryAdapter. when activity starts, the list is shown correctly, but after scrolling, some items are duplicated. I've searched for solutions, but almost every solution was to setTag() or Inflater. I think my code is ok with them.. so I cann't really understand whats the problem here...
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;
}
here is part where ArrayList is filled:
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();
}
You are using ViewHolder pattern, you need "clean" the previous values.
Like this.
if (mes.myMessage()){
messageHolder.myTxt.setText(mes.toString());
messageHolder.hisTxt.setText("");
} else {
messageHolder.myTxt.setText("");
messageHolder.hisTxt.setText(mes.toString());
}
Hope its helps.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.