私はAndroid 2.3.3(Gingerbread)で開発していますが、私はListViewに50個のアイテムを表示するこの特定のアクティビティを持っています。問題は、アクティビティが開始されたときに、リストビューでスクロールダウンを開始したときに、リストビューが項目を正しく表示しないことです。 "Title:xx"、 "Element:xx"ではなく、 "Title:12"、 "Element:12"と表示されなければならない誤解を招く要素がリストビューに存在します.xx - > 1 < = xx < = ELEMENT_SIZE 。しかし、その位置をクリックすると、正しい要素が表示されます。AndroidリストビューBUG?
xmlとソースコードは、下にあります。
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
child.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/childTextTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/childTextDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
ListViewDebugActivty事前に
public class ListViewDebugActivity extends Activity {
private final static int ELEMENT_SIZE = 50;
private ListView listView;
private List<Element> elements;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialize();
fillListView();
}
private void initialize() {
listView = (ListView) findViewById(R.id.listView);
elements = new ArrayList<Element>();
}
private void fillListView() {
final String elementTitle = "Title: ";
final String elementDetail = "Detail: ";
for(int index = 0; index < ELEMENT_SIZE; index ++) {
elements.add(new Element(elementTitle + (index + 1), elementDetail + (index + 1)));
}
listView.setAdapter(new ListViewAdapter(this, R.layout.child, elements));
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
Element element = elements.get(position);
String message = position + " = " + element.getTitle() + " : " + element.getDetail();
Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG).show();
}
});
}
private class Element {
private String title, detail;
public Element(String title, String detail) {
this.title = title;
this.detail = detail;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
private class ListViewAdapter extends ArrayAdapter<Element> {
private List<Element> objects;
private TextView childTitle, childDetail;
public ListViewAdapter(Context context, int layout, List<Element> objects) {
super(context, layout, objects);
this.objects = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Element element = objects.get(position);
if(convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.child, null);
childTitle = (TextView) convertView.findViewById(R.id.childTextTitle);
childDetail = (TextView) convertView.findViewById(R.id.childTextDetail);
}
if(element != null && convertView != null) {
childTitle.setText(element.getTitle());
childDetail.setText(element.getDetail());
}
return convertView;
}
}
}
感謝。
へ
私はそれを試してみましょう。パフォーマンスは私が考えることができる最高のソリューションです。 –
このソリューションは素晴らしいです。それは私を助け、素晴らしいパフォーマンスをもたらしました。しかし、主要な問題に似ている最後の要素に問題があります。 –
しかし、インスタンス化をgetView()の内部に移しましたか? – josephus