简体   繁体   English

Android ListView在滚动时重复项目

[英]Android ListView repeating items on scrolling

I'm working on Android project. 我正在研究Android项目。 one of my activities has inner class ChatHistoryAdapter. 我的一个活动有内部类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. 我已经搜索过解决方案,但几乎每个解决方案都是setTag()或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: 这是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();
}

在此输入图像描述

You are using ViewHolder pattern, you need "clean" the previous values. 您正在使用ViewHolder模式,您需要“清理”以前的值。

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. 希望它的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM