-1

Я использую listview с адаптером курсора. Это listview имеет изображение в каждом элементе, когда я нажимаю на это изображение. Я меняю изображение изображения, которое меняется правильно, но когда i прокрутите список изменений в моем представлении в своем представлении orignal. . Примечание: Я использую адаптер курсора (я знаю о рециркуляции списке следует, и я знаю, чтобы контролировать изменение значения в простой адаптер (модель, основанная)) Вот мой курсор адаптер:Значение списка ListView изменяется при прокрутке в пользовательском адаптере курсора

@Override 
public void bindView(View view, final Context context, Cursor cursor) { 
    spotsImage = (SimpleDraweeView) view.findViewById(R.id.spotsImage); 
    ivFavourite = (ImageView) view.findViewById(R.id.favouriteButton); 
     ivFavourite.setTag(cursor.getString(cursor.getColumnIndex(Constants.PEEP_ID))+"tag"+cursor.getInt(cursor.getColumnIndex(Constants.PEEP_STATUS))); 
    spotsTitle = (TextView) view.findViewById(R.id.titleTextView); 
    followerscount = (TextView) view.findViewById(R.id.distanceTextView); 

    spotsTitle.setText(cursor.getString(cursor.getColumnIndex(Constants.PEEP_NAME))); 


    Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(Constants.PEEP_PROFILE))); 
    spotsImage.setImageURI(uri); 

    count = cursor.getInt(cursor.getColumnIndex(Constants.PEEP_FOLLOWER_COUNT)); 
    if (count > 1){ 
     followerscount.setVisibility(View.VISIBLE); 
     followerscount.setText(count+" followers"); 
    } 
    else if (count == 1){ 
     followerscount.setVisibility(View.VISIBLE); 
     followerscount.setText(count+" follower"); 
    } 
    else { 
     followerscount.setVisibility(View.INVISIBLE); 
    } 

    if (cursor.getInt(cursor.getColumnIndex(Constants.PEEP_STATUS)) == 1) { 
     ivFavourite 
       .setImageResource(R.drawable.favourites_tapped); 
    } else { 
     ivFavourite.setImageResource(R.drawable.favourites); 
    } 

    ivFavourite.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 

      String [] Tags = ((String) v.getTag()).split("tag"); 

      if (Tags[1].equals("1")) { 



        ((ImageView) v).setImageResource(R.drawable.favourites); 

      } 
      else { 

        ((ImageView) v).setImageResource(R.drawable.favourites_tapped); 


      } 
     } 
    }); 
} 
+0

Возможный дубликат [Как механизм рециркуляции ListView работает] (http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works) – 2Dee

+0

благодарит за answer.I знаю о переработке списков, и я знаю, как контролировать изменение стоимости в простом адаптере (на основе модели), но я сталкиваюсь с проблемами с адаптером курсора. –

+0

Я думаю, проблема заключается в том, что, поскольку свитки ListView bindView вызывается снова, и когда он вызывается, это похоже на то, что он еще не был нажат, поэтому изображение возвращается к умолчанию. Вам нужно найти способ отметить этот элемент, чтобы узнать, какое изображение использовать. – AdamMc331

ответ

0

Как видно из списка свитков дальнейших вверх/вниз, ссылка удерживается в позиции, на которую вы смотрите, где заполняются данные. Другими словами, когда элементы находятся вне экрана и должны быть отображены на экране, эта позиция списка уже обработана и перемещена, поэтому данные будут неверными.

Я бы попробовал реализовать пользовательский BaseAdapter и надуть элементы управления. Если вы дадите мне минуту я даже сделать это для вас ...

public class MyAdapter extends BaseAdapter { 
    private Cursor cursor = null; 
    private Context context = null; 
    public MyAdapter(Context context, Cursor cursor) 
    { 
     this.context = context; 
     if (cursor != null) 
     { 
      cursor.moveToFirst(); 
      this.cursor = cursor; 
     } 
    } 
@Override 
public int getCount() { 
    return cursor.getCount(); 
} 

@Override 
public Object getItem(int position) { 
    //processed at runtime 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    cursor.moveToPosition(position); 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.mylistitem); 
    spotsImage = (SimpleDraweeView) view.findViewById(R.id.spotsImage); 
    ivFavourite = (ImageView) view.findViewById(R.id.favouriteButton); 
    ivFavourite.setTag(cursor.getString(cursor.getColumnIndex(Constants.PEEP_ID))+"tag"+cursor.getInt(cursor.getColumnIndex(Constants.PEEP_STATUS))); 
    spotsTitle = (TextView) view.findViewById(R.id.titleTextView); 
    followerscount = (TextView) view.findViewById(R.id.distanceTextView); 
    Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(Constants.PEEP_PROFILE))); 
    spotsImage.setImageURI(uri); 
    count = cursor.getInt(cursor.getColumnIndex(Constants.PEEP_FOLLOWER_COUNT)); 
    if (count > 1){ 
     followerscount.setVisibility(View.VISIBLE); 
     followerscount.setText(count+" followers"); 
    } 
    else if (count == 1){ 
     followerscount.setVisibility(View.VISIBLE); 
     followerscount.setText(count+" follower"); 
    } 
    else { 
     followerscount.setVisibility(View.INVISIBLE); 
    } 

    if (cursor.getInt(cursor.getColumnIndex(Constants.PEEP_STATUS)) == 1) { 
     ivFavourite 
       .setImageResource(R.drawable.favourites_tapped); 
    } else { 
     ivFavourite.setImageResource(R.drawable.favourites); 
    } 

    ivFavourite.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      String [] Tags = ((String) v.getTag()).split("tag"); 
      if (Tags[1].equals("1")) { 
       ((ImageView) v).setImageResource(R.drawable.favourites); 
      } 
      else { 
       ((ImageView) v).setImageResource(R.drawable.favourites_tapped); 
      } 
     } 
    }); 
    return convertView; 
} 

}

EDIT:

Ох и убедитесь, что вы реализуете метод утилизации ваши растровые изображения OnPause или вы будете ветер с исключениями OOM

Или, если вы все еще собираетесь использовать CursorAdapter добавить этот метод к вашему SQLiteDatabase:

в базе данных добавьте меня ThOD

public void updatePeepStatusById(int id, int newStatus) 
{ 
    SQLiteDatabase db = getWriteableDatabase(); 
    ContentValues cv = new ContentValues(); 
    cv.put(Constants.PEEP_STATUS, newStatus); 
    db.update(PEEPTABLE, cv, PEEPID + " = ?", new String[{Integer.toString(id)}]); 

} 

, а затем вызвать: cursor.requery(); notifyDataSetChanged();

Everytime вы хотите изменить значение

+0

Я сталкиваюсь с проблемой с адаптером курсора. я мог бы уже сделать это с помощью baseadapter.if вы можете помочь с адаптером курсора, который будет отличным help.thanks –

+0

ok Я сделаю это быстро и отправлю обратно – KoalaKoalified

+0

Возможно ли использовать менее инкапсулированную версию (то есть более доступную) любимый предмет? Как на месте isFavorite проверить в своем курсе результаты или даже хранить arraylist из избранных идентификаторов? – KoalaKoalified