Question

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();
}

enter image description here

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top