2012-08-02 84 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

相关问题