我创建了一个自定义list
,adapter
其中包含三个组件歌曲标题、歌曲编号和收藏图标。收藏图标用于标记或取消标记列表中的收藏项。请查看随附的视频以了解问题所在。
当我点击星星时,图标会被选中/取消选中并触发setOnFavoriteChangeListener
事件。如果我检查isFavorite
状态并相应地更新数据库。这是适配器的完整代码:
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;
}
}
该事件在adapter
设置的文件中listview
,它基本上检查最喜欢的明星的状态并更新数据库中歌曲的状态。您可以看到Toast
提示有关更新的消息。
我的问题是,即使我只是向上和向下滚动而不按星形图标,setOnFavoriteChangeListener
事件也会继续触发。这可以在Toast
消息和Log
记录中看到。我附上日志记录的快照也供您查看。
我个人更改了最喜欢的图标,只有开头的第 9 和第 42 首歌曲和最后的第 35 首歌曲。在这两者之间,我只不断向上和向下滚动,您可以看到 UPDATE 是如何自行发生的。
我的目标是标记最喜欢的项目列表。
为什么在setOnFavoriteChangeListener
我不碰它的情况下被解雇。
有没有其他方法可以从列表中标记最喜欢的项目并将它们保存在数据库中。
提前致谢