当RecyclerView中的项目超过5个时,开关会更改其行为

时间:2018-11-26 13:10:40

标签: java android android-recyclerview sqlite android-room

我有recyclerView显示数据库中的项目列表。在每个项目中,都有一个开关,根据数据库值显示值truefalse。 如果您更改开关状态(例如打开/关闭),它将使用当前布尔值更新数据库中的值。问题是,当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传递,将contextid作为数据库中的行。

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个项目后

1 个答案:

答案 0 :(得分:1)

您的问题是回收者视图中的行项目重复覆盖了getItemViewType方法,希望对您有用。

@Override
    public int getItemViewType(int position) {
        return position;
    }