2013-04-09 1 views
1

데이터베이스에서 정보를 가져 오는 사용자 지정된 SimpleCursorAdapter가 있습니다. 한 값이 1이면 ImageView의 배경에 색을 지정하고, 0이면 색을 지정하지 않습니다. ListView가로드 될 때 모든 것이 정확하지만 목록의 항목을 스크롤하면 이미지가 잘못 표시됩니다.CursorAdapter가 자동 업데이트 이미지

============ 그냥로드 ============ 하나의 스크롤 위로 ==== 다운 후

ListView 재활용에 대해 알고 있고, 한 항목이 화면 밖으로 나올 때 리소스가 해제되지만, 화면에 다시 돌아올 때 왜 잘못로드되는지 알 수 없습니다. 색상을 원할 때 단순히 ImageView 색상을 투명하게 설정하는 것이 좋습니다.이 해결 방법은 제대로 작동하는 유일한 방법입니까?

이 내 관련 코드입니다 :

RecipeCursorAdapter.java

public class RecipeCursorAdaptor extends SimpleCursorAdapter { 

private final Context mContext; 
private final int mLayout; 
private final Cursor mCursor; 
private final LayoutInflater mLayoutInflater; 

public CustomCursorAdaptor(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    this.mLayout = layout; 
    this.mContext = context; 
    this.mCursor = c; 
    this.mLayoutInflater = LayoutInflater.from(mContext); 
} 

private final class ViewHolder { 
    TextView txt_title; 
    TextView txt_time; 
    TextView txt_difficulty; 
    ImageView img_color; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    if (mCursor.moveToPosition(position)) { 
     ViewHolder viewHolder; 

     if (convertView == null) { 
      convertView = mLayoutInflater.inflate(mLayout, null); 

      viewHolder = new ViewHolder(); 
      viewHolder.img_color = (ImageView) convertView.findViewById(R.id.ricettaColore); 
      viewHolder.txt_title = (TextView) convertView.findViewById(R.id.ricettaTitolo); 
      viewHolder.txt_time = (TextView) convertView.findViewById(R.id.ricettaTempo); 
      viewHolder.txt_difficulty = (TextView) convertView.findViewById(R.id.ricettaDifficolta); 

      convertView.setTag(viewHolder); 
     } 
     else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     String title = mCursor.getString(1); 
     String time = mCursor.getString(2); 
     String difficulty = mCursor.getString(3); 
     int vegetarian = mCursor.getInt(4); 

     viewHolder.txt_title.setText(title); 
     viewHolder.txt_time.setText(time); 
     viewHolder.txt_difficulty.setText(difficulty); 

     if(vegetarian == 1) 
      viewHolder.img_color.setBackgroundColor(0xff669900); 
      /* Adding these two lines it works properly 
      else 
      viewHolder.img_color.setBackgroundColor(0x00000000); 
      */ 

    } 
    return convertView; 
} 

list_ricette.xml

<?xml version="1.0" encoding="utf-8"?> 

<ImageView 
    android:id="@+id/ricettaColore" 
    android:layout_width="5dip" 
    android:layout_height="45dip" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:contentDescription="Ricetta vegetariana" /> 

<TextView 
    android:id="@+id/ricettaTitolo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dip" 
    android:layout_toRightOf="@+id/ricettaColore" 
    android:scrollHorizontally="false" 
    android:singleLine="true" 
    android:text="Titolo Ricetta" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/ricettaDifficolta" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/ricettaTitolo" 
    android:layout_below="@+id/ricettaTitolo" 
    android:scrollHorizontally="false" 
    android:singleLine="true" 
    android:text="Difficoltà" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textColor="#A1A1A1" /> 

<TextView 
    android:id="@+id/ricettaTempo" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/ricettaDifficolta" 
    android:layout_alignParentRight="true" 
    android:layout_below="@+id/ricettaTitolo" 
    android:gravity="right" 
    android:text="Tempo" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textColor="#A1A1A1" /> 

+1

'ListView 재활용에 대해 알고 있고, 한 항목이 화면에서 벗어 났을 때 리소스가 해제되고'해제되지 않음 ... ** 재사용 ** ... 재사용 된 항목이 1 또는 0이고 새로운 값은 ok보다 1입니다.하지만 재사용 된 항목이 1이고 새 값이 0이면 ... – Selvin

+0

그래서 내가 아는 것은 잘못되었습니다. 정보에 감사드립니다! – Mangusto

+0

fyi :'convertView! = null'이라면'convertView'는 오래되고 보이지 않는 (화면 밖으로) item/view – Selvin

답변

0

ViewHolder 클래스를 정적으로 만들고 해당 뷰 홀더 클래스 내에 정적 int 배열을 만들려고합니다. getView에서 데이터베이스의 값을 사용하여 해당 배열을 설정하고 배열을 사용하여 원하는대로 행을 설정해야합니다.

이것은 내가 ExpandableListView에서 올바른 확인란을 유지 관리하는 방법은 다음과 같습니다

static class ViewHolder { 
    CheckBox check; 
    static boolean[][] bool = new boolean[parentCounter][childCounter]; 

    public static void setChecked(int parent, int child, boolean value) { 
     bool[parent][child] = value; 
    } 

    public static boolean getChecked(int parent, int child) { 
     return bool[parent][child]; 
    } 
} 

그것은 동일한 개념이다.