【问题标题】:Android ListView repeating items on scrollingAndroid ListView在滚动时重复项目
【发布时间】:2014-05-11 17:57:54
【问题描述】:

我正在开发 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();
}

【问题讨论】:

  • 列表包含重复项?或者是创建它们的列表视图?检查列表的元素。

标签: java android listview baseadapter


【解决方案1】:

您正在使用 ViewHolder 模式,您需要“清理”以前的值。

像这样。

if (mes.myMessage()){

      messageHolder.myTxt.setText(mes.toString());
      messageHolder.hisTxt.setText("");

} else {

      messageHolder.myTxt.setText("");
      messageHolder.hisTxt.setText(mes.toString());
}

希望对您有所帮助。

【讨论】:

  • 谢谢你。工作了几个小时,尝试了一切,但这个.. +
  • 我很乐意提供帮助 :) 请标记为正确答案。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多