2012-08-02 69 views
2

我有一個自定義適配器和自定義行的列表。getView在自定義適配器中顯示錯誤的圖像?

的問題是,當我滾動列表視圖,圖像是在錯誤的位置...

這裏是自定義行XML:

<LinearLayout 
    android:id="@+id/imagequality_listview_row_linearlayout" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:weightSum="1" 
    android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android"> 


    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/imagequality_listview_row_textview" 
android:layout_width="0dp" 
android:layout_height="40dip" 
android:gravity="right" 
android:paddingLeft="5dip" 
android:drawableLeft="?android:attr/listChoiceIndicatorMultiple" 
android:layout_weight="0.6" 
/> 

     <com.example.listviewtest.LoaderImageView 
    android:id="@+id/imagequality_listview_row_loaderImageView" 
    android:layout_width="0dp" 
    android:layout_weight="0.4" 
    android:layout_height="100dp" 
    image="http://developer.android.com/images/dialog_buttons.png" 
    /> 

</LinearLayout> 

這裏是GetView:

List<ImageQuality_Item> items; 
    Context context; 
    List<CheckedTextView> checkedList; 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = View.inflate(context, R.layout.imagequality_listview_row, null); 
      holder = new ViewHolder(); 
      holder.layout = (LinearLayout) convertView.findViewById(R.id.imagequality_listview_row_linearlayout); 

      holder.textview = (CheckedTextView) convertView.findViewById(R.id.imagequality_listview_row_textview); 
      holder.image = (LoaderImageView) convertView.findViewById(R.id.imagequality_listview_row_loaderImageView); 
      checkedList.add(holder.textview); 
      holder.layout.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        for (int i = 0; i < checkedList.size(); i++) 
         if (checkedList.get(i).isChecked()) 
          checkedList.get(i).setChecked(false); 
        ((CheckedTextView) ((LinearLayout) v).getChildAt(0)).setChecked(true); 
       } 
      }); 

      holder.textview.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        for (int i = 0; i < checkedList.size(); i++) 
         if (checkedList.get(i).isChecked()) 
          checkedList.get(i).setChecked(false); 
        ((CheckedTextView) v).setChecked(true); 
       } 
      }); 
      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     holder.textview.setText(items.get(position).getDescription()); 
     if (holder.image.used == false) { 
      holder.image.setImageDrawable(items.get(position).getURL()); 
      holder.image.used = true; 
     } 

     return convertView; 
    } 

    class ViewHolder { 
     LinearLayout layout; 
     LoaderImageView image; 
     CheckedTextView textview; 
    } 

我該如何解決這個問題?

回答

3

每次調用getView()時,都必須設置Drawable,因爲android正在重用列表元素。如果不更新,可能會出現較早設置的圖像。

只是刪除你的條件設置圖像可繪製,它會工作。

+0

但現在滾動後,然後返回到前面顯示的項目,圖像再次被重新加載..這就是爲什麼我把這種情況阻止這種情況發生,但也造成了錯誤。我怎樣才能解決這個問題? – Omar 2012-08-02 21:11:53

+0

你不能。正如我所說的,android正在重複使用虛增的列表項目佈局,以節省內存。如果您不每次都初始化這些項目,那麼您的數據將不一致。 – 2012-08-03 06:56:36

相關問題