ListViewで重複したアイテムを取得します。前後にスクロールすると、アイテムの順序が変わることがあります。私はグーグルでこのバグを報告している多くのスレッドを見つけました、しかしそれらのどれも私の問題を修正するのを助けませんでした。
これが私のコードです:
アクティビティ:
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
を再利用する必要があります。 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
は、位置による要素へのアクセスを許可します。
ListAdapterでViewHolderパラダイムを使用する必要があります
素敵な例はここにあります: http://developer.Android.com/resources/samples/ApiDemos/src/com/example/Android/apis/view/List14.html
提案-title.setTextの後にログステートメントを追加し、getTitle()から取得した値を書き込みます。エントリが重複している理由を知っているかもしれません。