2016-04-09 4 views
1

私はリストビューを持っており、カスタムCursorAdapterを添付しています。リストビューの各項目には、onClickが発生したときにこの画像を変更したい画像があります。 たとえば、位置4の画像をクリックすると、位置10の画像が変更され、画像4は変更されません。 これはなぜ起こるのですか?SetImageResource()がCursorAdapterのリストビューで正しく機能しない

私のカスタムCursorAdapterは次のとおりです。

public class CustomFehrestAdapter extends CursorAdapter { 

String Tag; 
ImageView favic; 
SQLiteDatabase db; 
int pos; 
Activity ac; 

public CustomFehrestAdapter(Context context, Cursor c,Activity ac,SQLiteDatabase db) { 
    super(context, c); 
    this.ac =ac; 
    this.db = db; 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return LayoutInflater.from(context).inflate(R.layout.customfehrestitem,parent,false); 
} 

@Override 
public void bindView(View view, final Context context, final Cursor cursor) { 

    TextView item = (TextView) view.findViewById(R.id.fehresttxt); 
    favic = (ImageView) view.findViewById(R.id.favic); 
    pos = cursor.getPosition(); 

    String title; 

    title = cursor.getString(cursor.getColumnIndex("titr1")); 

    final boolean isfav = checkFav(cursor); 
    if(isfav)favic.setImageResource(R.drawable.fav_ic); 
    else favic.setImageResource(R.drawable.favnot_ic); 

    item.setText(title); 
    final int idx = cursor.getInt(cursor.getColumnIndex("_id")); 


// here is my image onClick handler. 
    favic.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(!isfav){ 
       db.execSQL("update content set favorite=1 where ID="+idx+";"); 
       System.out.print("Add to favs"); 


      fav.setImageResource(R.drawable.fav_ic); 

      } 
      else{ 
       db.execSQL("update content set favorite=0 where ID=" + idx + ";"); 
       System.out.print("Remove from favs"); 


       fav.setImageResource(R.drawable.favnot_ic); 
      } 
     } 
    }); 
} 

public boolean checkFav(Cursor cursor) { 
    int ppp = (int) favic.getTag(); 
    cursor.moveToFirst(); 
    cursor.moveToPosition(ppp); 
    int check = cursor.getInt(cursor.getColumnIndex("favorite")); 
    return check != 0; 
} 
} 

答えて

2

はnewView方法であなたのonClickListenerを設定してみてください。

リストビューは、各リストアイテムのビューをリサイクルまたは再利用します.1000リストアイテムがあるとします。アダプタは、画面に収まる特定の数のビューを作成し、データで初期化します。したがって、newViewが呼び出されます画面上に表示されるビューの数だけ表示されます。バインドビューは1000回呼び出されますが、 あなたは...あなたのbindViewが毎回呼び出される

を望んでいないだろうpublicクラスCustomFehrestAdapterは、あなたの答えが正しいかCursorAdapter {

String Tag; 
SQLiteDatabase db; 
int pos; 
Activity ac; 

public CustomFehrestAdapter(Context context, Cursor c, Activity ac, SQLiteDatabase db) { 
    super(context, c); 
    this.ac = ac; 
    this.db = db; 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View view = LayoutInflater.from(context).inflate(R.layout.customfehrestitem, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view); 
    view.setTag(viewHolder); 
    return view; 
} 

@Override 
public void bindView(View view, final Context context, final Cursor cursor) { 

    String title = cursor.getString(cursor.getColumnIndex("titr1")); 
    boolean isfav = checkFav(cursor); 
    ViewHolder viewHolder = (ViewHolder) view.getTag(); 
    if (isfav) 
     viewHolder.favic.setImageResource(R.drawable.fav_ic); 
    else 
     viewHolder.favic.setImageResource(R.drawable.favnot_ic); 
    viewHolder.item.setText(title); 

    final int idx = cursor.getInt(cursor.getColumnIndex("_id")); 
    // here is my image onClick handler 
    viewHolder.id = idx; 
} 

public boolean checkFav(Cursor cursor) { 
    int ppp = (int) favic.getTag(); 
    cursor.moveToFirst(); 
    cursor.moveToPosition(ppp); 
    int check = cursor.getInt(cursor.getColumnIndex("favorite")); 
    return check != 0; 
} 


public class ViewHolder implements View.OnClickListener { 

    TextView item; 
    ImageView favic; 
    int id = -1; 
    boolean isfav; 

    public ViewHolder(View view) { 
     item = view.findViewById(R.id.fehresttxt); 
     favic = (ImageView) view.findViewById(R.id.favic); 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (id != -1) { 
      if (!isfav) { 
       db.execSQL("update content set favorite=1 where ID=" + idx + ";"); 
       System.out.print("Add to favs"); 
       favic.setImageResource(R.drawable.fav_ic); 

      } else { 
       db.execSQL("update content set favorite=0 where ID=" + idx + ";"); 
       System.out.print("Remove from favs"); 
       favic.setImageResource(R.drawable.favnot_ic); 
      } 
     } 
    } 
} 

}

+0

を拡張します。更新データベースをクリックしてイメージを変更したアイテムのIDが必要です。どうすればそれにアクセスできますか? –

+0

favView.setOnClickListenerはnewView()メソッドで使用するとうまく動作しません。理由はわかりません。 –

+0

viewHolderのデザインパターンを試してみてください... urのリファレンスについてはこちらをご覧ください.... http://stackoverflow.com/questions/4567969/viewholder-pattern-correctly-implemented-in-custom-cursoradapter –