/ / Hodnota zoznamu položiek sa mení pri posúvaní v prispôsobenom kurzorovom adaptéri - android, listview, android-listview, kurzor, android-cursoradapter

Hodnota položky zoznamu sa mení pri posúvaní v prispôsobenom kurzorovom adaptéri - android, listview, android-listview, kurzor, android-cursoradapter

Používam zobrazenie zoznamu s adaptérom kurzora.Toto zobrazenie v zozname má zobrazenie obrázkov v každej položke, keď kliknem na toto zobrazenie obrázka Zmením obrázok s obrázkom, ktorý sa správne mení, ale keď posúvam zobrazenie obrázkov v zozname na jeho orignálny pohľad. Poznámka: Používam kurzorový adaptér (viem o recyklácii listov a viem, že kontroluje zmenu hodnoty v jednoduchom adaptéri (založený na modeli)). Tu je môj adaptér kurzora:

@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);


}
}
});
}

odpovede:

0 pre odpoveď č. 1

Keďže sa zoznam posúva ďalej nahor / nadol,odkaz na pozíciu, na ktorú sa pozeráte a na ktorom sa údaje zmení. Inými slovami, ak sú položky offscreen a musia byť vykreslené na obrazovke, táto pozícia zoznamu už bola spracovaná a presunutá tak, aby boli údaje nesprávne.

Pokúsil by som sa implementovať vlastný BaseAdapter a nafúknuť ovládacie prvky. Ak mi dáš chvíľu, urobím to pre teba ...

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:

Oh a uistite sa, že implementujete metódu na recykláciu bitmapy na Pauze alebo skončíte s výnimkami OOM

Alebo ak stále používate CursorAdapter, pridajte túto metódu do SQLiteDatabase:

vo svojej databáze pridajte metódu

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)}]);

}

a potom zavolajte: cursor.requery (); notifyDataSetChanged ();

Kedykoľvek chcete zmeniť hodnotu