2012-02-16 11 views
1

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

    } 

} 

感謝。

答えて

2

私はViewHoldersについて講義しませんが、今のところ、getViewメソッド内でchildTitleとchildDetailのインスタンスを移動すると、問題が解決するはずです。 リストビューでスピードと効率を上げたい場合は、リンクをクリックしてください。

+0

if(element != null && convertView != null) { childTitle.setText(element.getTitle()); childDetail.setText(element.getDetail()); } 

私はそれを試してみましょう。パフォーマンスは私が考えることができる最高のソリューションです。 –

+0

このソリューションは素晴らしいです。それは私を助け、素晴らしいパフォーマンスをもたらしました。しかし、主要な問題に似ている最後の要素に問題があります。 –

+0

しかし、インスタンス化をgetView()の内部に移しましたか? – josephus

0

チェンジ・ライン:

if(convertView == null) { 
      convertView = getLayoutInflater().inflate(R.layout.child, null); 

     } 
     if(onvertView != null) 
     { 
      childTitle = (TextView) convertView.findViewById(R.id.childTextTitle); 
      childDetail = (TextView) convertView.findViewById(R.id.childTextDetail); 
      if(element != null) { 
        childTitle.setText(element.getTitle()); 
      } 
     } 
+2

本当に、あなたはchildTitleを初期化する前にsetTextを使うことができますか? – josephus

+0

私はそれが今正しいと思う – jeet

+0

Ooops。ごめんなさい。私のコードでNullPointerExceptionが発生する可能性があります。しかし、私が知る限り、convertViewがnullの場合、childTitleとchildDetailもnullになります。 –