Java ListView中的重复条目

Java ListView中的重复条目,java,android,listview,listactivity,android-arrayadapter,Java,Android,Listview,Listactivity,Android Arrayadapter,我在列表视图中得到重复的项。上下滚动有时会更改项目顺序。 我在谷歌上搜索,发现许多线程报告了这个错误,但没有一个线程帮助我解决问题 这是我的密码: 活动: package com.github.progval.SeenDroid; import java.util.ArrayList; import java.util.List; import com.github.progval.SeenDroid.lib.Connection; import com.github.progval.See

我在列表视图中得到重复的项。上下滚动有时会更改项目顺序。 我在谷歌上搜索,发现许多线程报告了这个错误,但没有一个线程帮助我解决问题

这是我的密码:

活动:

package com.github.progval.SeenDroid;

import java.util.ArrayList;
import java.util.List;

import com.github.progval.SeenDroid.lib.Connection;
import com.github.progval.SeenDroid.lib.Message;
import com.github.progval.SeenDroid.lib.MessageFetcher;
import com.github.progval.SeenDroid.lib.Query.ParserException;

import android.app.Activity;
import android.app.ListActivity;
import android.content.SharedPreferences;
import android.os.Bundle;

public class ShowUserActivity extends ListActivity {
    private Connection connection;

    public ArrayList<Message> listMessages = new ArrayList<Message>();
    public MessageAdapter adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.profile);
        this.connection = new Connection();
        this.setTitle(R.string.homefeed_title);


        this.listMessages = new MessageFetcher(this.connection).fetchUser();
        this.bindUi();
    }

    private void bindUi() {
        this.adapter = new MessageAdapter(this, this.listMessages);
        this.setListAdapter(adapter);

        // TODO Bind buttons
    }
}
问候,,
ProgVal

建议-在title.setText之后添加日志语句,并写入从getTitle()获得的值。您可能会知道为什么会得到重复条目。

ListView不能保证添加到其中的项目的唯一性。这是你的责任。您正在使用
ArrayList
存储项目,它可以存储任意数量的重复项目

如果要删除重复项,请将项目放入集合,然后再放入列表:

listMessages=newarraylist(newlinkedhashset(listMessages))

LinkedHashSet
将删除保留项目初始顺序的重复项,
ArrayList
将允许按位置访问元素

试试这个:

public View getView(int position, View convertView, ViewGroup parent) {

    if (null == convertView) {
        LinearLayout view = (LinearLayout) LinearLayout.inflate(this.context, 
            R.layout.message, null);
        Log.d("SeenDroid", String.format("Get view %d", position));
        TextView title = new TextView(view.getContext());
        title.setText(this.items.get(position).getTitle());
        view.addView(title);
        return view;
    } else {
        LinearLayout view = (LinearLayout) convertView;
        TextView title = (TextView) view.getChildAt(0);
        title.setText(this.items.get(position).getTitle());
        return convertView;
    }
}

解释:您得到了重复项,因为Android上的列表重用UI对象。如果
convertView
不为空,则需要重新使用它,而不是创建一个新的。当然,您有责任为被重用的实例设置适当的值。否则,该值将从上一次的“用法”中删除。

您应该在ListAdapter中使用ViewHolder范例

这里可以找到一个很好的例子:

好的,我知道了。我认为这只是对同一个项目重用对象,而不是其他项目。但是,当我滚动时,滚动条会越来越大,越来越小,这取决于当前显示项目的高度。@Arhimed你能更详细地解释“解释”部分吗。这个问题困扰了我很长一段时间。@abhishekb:请查看详细信息-谢谢@Arhimed你救了我一天。如何使用Bind view new view,我尝试了标签持有者模式,但仍然重复。
D/SeenDroid(30939): Get view 0
D/SeenDroid(30939): Get view 1
D/SeenDroid(30939): Get view 2
D/SeenDroid(30939): Get view 3
D/SeenDroid(30939): Get view 4
D/SeenDroid(30939): Get view 5
D/SeenDroid(30939): Get view 6
D/SeenDroid(30939): Get view 7
D/SeenDroid(30939): Get view 8
D/SeenDroid(30939): Get view 0
D/SeenDroid(30939): Get view 16
public View getView(int position, View convertView, ViewGroup parent) {

    if (null == convertView) {
        LinearLayout view = (LinearLayout) LinearLayout.inflate(this.context, 
            R.layout.message, null);
        Log.d("SeenDroid", String.format("Get view %d", position));
        TextView title = new TextView(view.getContext());
        title.setText(this.items.get(position).getTitle());
        view.addView(title);
        return view;
    } else {
        LinearLayout view = (LinearLayout) convertView;
        TextView title = (TextView) view.getChildAt(0);
        title.setText(this.items.get(position).getTitle());
        return convertView;
    }
}
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View gridView;
    if (convertView == null) {
        gridView = new View(context);
    } else {
        gridView = (View) convertView;
    }
    gridView = inflater.inflate(R.layout.worker_listmain, null);
    // your source code here!!! Run 100%
    // I got this problem also, I found out the way to solve it! 
    // Please use my source code :D SIMPLE is PERFECT :D
    return gridView;
}