我有recyclerView显示数据库中的项目列表。在每个项目中,都有一个开关,根据数据库值显示值true
或false
。
如果您更改开关状态(例如打开/关闭),它将使用当前布尔值更新数据库中的值。问题是,当RecyclerView中最多包含5个项目时,它可以很好地工作。如果有5个以上的项目,则所有项目的开关会将其状态更改为“开/随机”,并更新数据库中的行。当我通过仅显示具有当前状态的Toast进行测试时,一切正常。
我在2个数据库上进行了测试,结果相同:两个都使用ContentProviders sqlite3
,现在我使用LiveData迁移到Room。
这是我在适配器中设置onCheckedChanged
的方式:
@NonNull
@Override
public AlarmViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.alarm_item, parent, false);
return new AlarmViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AlarmViewHolder holder, int position) {
//get data for current adapter position
Alarms currentData = mAlarms.get(position);
//check if alarm is valid and then set this value to the switch
holder.isAlarmActiveSwitch.setChecked(currentData.isValid());
new validationUpdater().switchChangedListener
(holder.isAlarmActiveSwitch,
context, currentData.get_id());`
}
我创建validationUpdater()
类的实例,并调用方法switchChangedListener
,将holder.isAlarmActiveSwitch
作为Switch传递,将context
和id
作为数据库中的行。
switchChangedListener()
方法:
public void switchChangedListener(@NotNull final Switch switchActive, @NotNull final Context context, final long id) {
switchActive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton compoundButton, final boolean b) {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
AlarmDatabase db = AlarmDatabase.getInstance(context);
AlarmsDao dao = db.alarmsDao();
dao.updateAlarm(id, b);
}
});
}
});
}
和来自Dao的@Query:
@Query("UPDATE alarm_table SET valid = :valid WHERE _id = :id")
void updateAlarm(final long id, final boolean valid);
任何人都可以解释我为什么这不起作用,因为应该只在显示超过5个项目后 ?
答案 0 :(得分:1)
您的问题是回收者视图中的行项目重复覆盖了getItemViewType方法,希望对您有用。
@Override
public int getItemViewType(int position) {
return position;
}