我已經創建了一個自定義list
,adapter
其中包含三個組件歌曲標題,歌曲編號和最喜歡的圖標。收藏夾圖標用於標記或取消標記列表中的收藏項目。 請看附件中的視頻,瞭解問題所在。當我滾動我的android應用程序中的自定義列表,然後最喜歡的圖標,這是自定義適配器的一部分自己更改
當我點擊的明星,圖標被選中/未選中,並觸發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;
}
}
此事件是其在listview
設置adapter
文件中,它基本上檢查喜愛的明星的狀態並更新歌曲的狀態在數據庫中。 您可以看到提示關於更新的消息Toast
。
我的問題是,即使我只是上下滾動而不按星形圖標,那麼setOnFavoriteChangeListener
事件也會持續發射。這可以在Toast
消息和Log
記錄中看到。我附上日誌記錄的快照,供您查看。
我個人改變了最開始只有歌曲9和42的最喜歡的圖標,最後是35。在兩者之間,我只是不斷滾動,你可以看到UPDATE是如何發生的。
我的目標是標記喜歡的物品列表。
爲什麼setOnFavoriteChangeListener
沒有我碰它就會被解僱。
是否有任何其他方法從列表中標記最喜歡的項目並將它們保存在數據庫中。
在此先感謝
你能發佈完整的適配器代碼嗎?這肯定會有所幫助。 –
以下是完整的適配器代碼 – pamo
我沒有看到任何適配器代碼。 –