J'ai créé un list
personnalisé, dont adapter
qui contient trois composants titre de chanson, numéro de chanson et icône préférée . L'icône favorite est destinée à marquer ou à décocher l'élément favori de la liste. Veuillez regarder la vidéo ci-jointe pour comprendre quel est le problème.lorsque je fais défiler la liste personnalisée dans mon application Android puis l'icône préférée qui fait partie de l'adaptateur personnalisé change de son propre
Lorsque je clique sur l'étoile, l'icône sélectionné obtient/désélectionnées et déclenche l'événement setOnFavoriteChangeListener
. Dans le cas je vérifie l'état isFavorite
et mettre à jour la base de données en conséquence. Voici le code complet de l'adaptateur:
public class song_index_adapter extends ArrayAdapter<song_index_model>{ //implements View.OnClickListener {
private ArrayList<song_index_model> dataSet;
Context mContext;
private int lastPosition = -1;
public song_index_adapter(ArrayList<song_index_model> data, Context context) {
super(context, R.layout.song_index_row, data);
this.dataSet = data;
this.mContext=context;
}
// View lookup cache
private static class ViewHolder {
TextView txt_sno;
TextView txt_title;
MaterialFavoriteButton favorite;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
// Get the data item for this position
final song_index_model dataModel = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
final ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.song_index_row, parent, false);
viewHolder.txt_sno = (TextView) convertView.findViewById(R.id.sno);
viewHolder.txt_title = (TextView) convertView.findViewById(R.id.songTitle);
viewHolder.favorite = (MaterialFavoriteButton) convertView.findViewById(R.id.indexfav);
result=convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
result.startAnimation(animation);
lastPosition = position;
viewHolder.txt_sno.setText(dataModel.getSno());
viewHolder.txt_title.setText(dataModel.getTitle());
//--- following conditional statements take care to
//--- not to show a star with the index letter
if(viewHolder.txt_sno.getText().toString().equals(""))
viewHolder.favorite.setVisibility(View.GONE);
else
viewHolder.favorite.setVisibility(View.VISIBLE);
viewHolder.favorite.setFavorite(dataModel.getFav());
int fsize = (gvar.fontsize * gvar.fontstep) + gvar.fontmin;
viewHolder.txt_title.setTextSize(fsize);
viewHolder.txt_sno.setTextSize(fsize);
viewHolder.favorite.setOnFavoriteChangeListener(new MaterialFavoriteButton.OnFavoriteChangeListener() {
@Override
public void onFavoriteChanged(MaterialFavoriteButton buttonView, boolean isfavorite) {
DBHelper db = new DBHelper(mContext);
SQLiteDatabase sdb = db.getWritableDatabase();
boolean isUpdate = db.updateData(gvar.table,dataModel.getSno(),dataModel.getTitle(),dataModel.getSong(),dataModel.getCategory(),isfavorite);
if(!isUpdate)
Toast.makeText(mContext, "Song Selection could not be saved", Toast.LENGTH_SHORT).show();
else {
Toast.makeText(mContext, "Updated " + dataModel.getSno(), Toast.LENGTH_SHORT).show();
Log.e("UPDATED", dataModel.getSno() + " " + isfavorite);
}
}
});
return convertView;
}
}
Cet événement est à l'intérieur du fichier adapter
qui est situé sur la listview
et il vérifie essentiellement l'état de la star préférée et mettre à jour le statut de la chanson dans la base de données. Vous pouvez voir les messages Toast
qui demandent la mise à jour.
Mon problème est que même si je fais simplement défiler vers le haut et vers le bas sans appuyer sur l'icône étoile, alors l'événement setOnFavoriteChangeListener
continue à se déclencher. Cela peut être vu dans les messages Toast
et dans les enregistrements Log
. Je joins également un instantané des enregistrements du journal que vous pouvez voir.
Personnellement, j'ai changé l'icône favorite des seules chansons n ° 9 et 42 au début et 35 à la fin. Entre les deux, je n'ai fait que défiler de haut en bas et vous pouvez voir comment la mise à jour se passe d'elle-même.
Mon but est de marquer la liste des objets favoris.
Pourquoi le setOnFavoriteChangeListener
se déclenche-t-il sans que je le touche?
Existe-t-il une autre méthode pour marquer les éléments favoris d'une liste et les enregistrer dans la base de données.
Merci à l'avance
Pouvez-vous poster votre code d'adaptateur complet? Cela aiderait certainement. –
Voici le code de l'adaptateur complet – pamo
Je ne vois aucun code d'adaptateur. –