ListView中重复的条目

我在ListView中获得重复的项目。 往回滚动有时会改变项目顺序。 我GOOGLE了,发现许multithreading报告这个错误,但没有一个帮助我解决我的问题。

这是我的代码:

活动:

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 } } 

MessageAdapter:

 package com.github.progval.SeenDroid; import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import com.github.progval.SeenDroid.lib.Message; import android.content.Context; import android.text.Layout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; public class MessageAdapter extends BaseAdapter { private Context context; private List<Message> items = new ArrayList<Message>(); private int lastPosition = 0; public MessageAdapter(Context context, List<Message> items) { super(); this.context = context; this.items = items; } public View getView(int position, View convertView, ViewGroup parent) { if (null == convertView) { LinearLayout view; 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 { return convertView; } } @Override public int getCount() { return this.items.size(); } @Override public Object getItem(int location) { return this.items.get(location); } @Override public long getItemId(int arg0) { return arg0; } } 

顺便说一下,输出是:

 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 

问候,ProgVal

尝试这个:

 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而不是创build一个新的,如果它不为null。 当然,您有责任为正在重用的实例设置适当的值。 否则,该值是从最后一个“用法”中留下的。

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

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

如果你想删除重复,把你的项目设置,然后再次列表:

listMessages = new ArrayList<Messages>(new LinkedHashSet<Message>(listMessages))

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

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

你应该在你的ListAdapter中使用ViewHolder范例

一个很好的例子可以在这里find: http : //developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html