adapter
には、曲名、曲番号、お気に入りアイコンの3つのコンポーネントが含まれているカスタムlist
を作成しました。 。お気に入りのアイコンは、お気に入りのアイテムをマークするか、マークを解除するためのアイコンです。 問題が何かを理解するために添付のビデオをご覧ください。 私のアンドロイドアプリでカスタムリストをスクロールすると、カスタムアダプターの一部であるお気に入りのアイコンが独自に変更されます
私は星をクリック
は、アイコンが選択されていない/選択と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
アダプタコードが表示されません。 –