Switch changes its behaviour when there are more than 5 items in RecyclerView
I have recyclerView showing list of items from database. In every item there is a switch showing value true
or false
depending on database value.
If you change switch state (e.g turn it on/off) it will update value in database with current boolean. What is the problem, that it works well when there are up to 5 items in RecyclerView. If there are more than 5 items Switches of all items change its state to on/randomly and updating the row in database. When I tested by showing just Toast with current state it all worked fine.
I tested on 2 databases with same result: both sqlite3
with ContentProviders and now I migrated to Room with LiveData.
This is how I set onCheckedChanged
in my adapter:
@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());`
}
I create instance of validationUpdater()
class and call the method switchChangedListener
, pass holder.isAlarmActiveSwitch
as Switch, context
and id
of row in Database.
switchChangedListener()
method:
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);
}
});
}
});
}
and @Query from Dao:
@Query("UPDATE alarm_table SET valid = :valid WHERE _id = :id")
void updateAlarm(final long id, final boolean valid);
Could anyone explain me why this doesn't work as supposed only after more than 5 items are displayed?
java android android-recyclerview sqlite3 android-room
add a comment |
I have recyclerView showing list of items from database. In every item there is a switch showing value true
or false
depending on database value.
If you change switch state (e.g turn it on/off) it will update value in database with current boolean. What is the problem, that it works well when there are up to 5 items in RecyclerView. If there are more than 5 items Switches of all items change its state to on/randomly and updating the row in database. When I tested by showing just Toast with current state it all worked fine.
I tested on 2 databases with same result: both sqlite3
with ContentProviders and now I migrated to Room with LiveData.
This is how I set onCheckedChanged
in my adapter:
@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());`
}
I create instance of validationUpdater()
class and call the method switchChangedListener
, pass holder.isAlarmActiveSwitch
as Switch, context
and id
of row in Database.
switchChangedListener()
method:
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);
}
});
}
});
}
and @Query from Dao:
@Query("UPDATE alarm_table SET valid = :valid WHERE _id = :id")
void updateAlarm(final long id, final boolean valid);
Could anyone explain me why this doesn't work as supposed only after more than 5 items are displayed?
java android android-recyclerview sqlite3 android-room
i'm not sure, but since you are using RecyclerView, i guess you are doing wrong with OnCheckChangeListener. maybe you are setting OnCheckChangeListener at onCreateViewHolder and when ViewHolder has been reused, it uses previous data to update database.
– yeonseok.seo
Nov 27 '18 at 6:01
@yeonseok.seo I've updated my adapter code. I'm setting onCheckChangeListener insideonBindViewHolder
method
– Domin
Nov 27 '18 at 10:50
1
hope this resolve after overrieding the getItemViewType method @Override public int getItemViewType(int position) { return position; }
– Zahoor Saleem
Nov 27 '18 at 11:13
@ZahoorSaleem please post your comment as the answer, it did work for me. Also could you provide me any logical explanation how it worked? I read documentation for this method, it is clear for me but I don't understand why it changed behaviour of Switch.
– Domin
Nov 27 '18 at 12:22
add a comment |
I have recyclerView showing list of items from database. In every item there is a switch showing value true
or false
depending on database value.
If you change switch state (e.g turn it on/off) it will update value in database with current boolean. What is the problem, that it works well when there are up to 5 items in RecyclerView. If there are more than 5 items Switches of all items change its state to on/randomly and updating the row in database. When I tested by showing just Toast with current state it all worked fine.
I tested on 2 databases with same result: both sqlite3
with ContentProviders and now I migrated to Room with LiveData.
This is how I set onCheckedChanged
in my adapter:
@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());`
}
I create instance of validationUpdater()
class and call the method switchChangedListener
, pass holder.isAlarmActiveSwitch
as Switch, context
and id
of row in Database.
switchChangedListener()
method:
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);
}
});
}
});
}
and @Query from Dao:
@Query("UPDATE alarm_table SET valid = :valid WHERE _id = :id")
void updateAlarm(final long id, final boolean valid);
Could anyone explain me why this doesn't work as supposed only after more than 5 items are displayed?
java android android-recyclerview sqlite3 android-room
I have recyclerView showing list of items from database. In every item there is a switch showing value true
or false
depending on database value.
If you change switch state (e.g turn it on/off) it will update value in database with current boolean. What is the problem, that it works well when there are up to 5 items in RecyclerView. If there are more than 5 items Switches of all items change its state to on/randomly and updating the row in database. When I tested by showing just Toast with current state it all worked fine.
I tested on 2 databases with same result: both sqlite3
with ContentProviders and now I migrated to Room with LiveData.
This is how I set onCheckedChanged
in my adapter:
@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());`
}
I create instance of validationUpdater()
class and call the method switchChangedListener
, pass holder.isAlarmActiveSwitch
as Switch, context
and id
of row in Database.
switchChangedListener()
method:
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);
}
});
}
});
}
and @Query from Dao:
@Query("UPDATE alarm_table SET valid = :valid WHERE _id = :id")
void updateAlarm(final long id, final boolean valid);
Could anyone explain me why this doesn't work as supposed only after more than 5 items are displayed?
java android android-recyclerview sqlite3 android-room
java android android-recyclerview sqlite3 android-room
edited Nov 27 '18 at 10:49
Domin
asked Nov 26 '18 at 13:10
DominDomin
459115
459115
i'm not sure, but since you are using RecyclerView, i guess you are doing wrong with OnCheckChangeListener. maybe you are setting OnCheckChangeListener at onCreateViewHolder and when ViewHolder has been reused, it uses previous data to update database.
– yeonseok.seo
Nov 27 '18 at 6:01
@yeonseok.seo I've updated my adapter code. I'm setting onCheckChangeListener insideonBindViewHolder
method
– Domin
Nov 27 '18 at 10:50
1
hope this resolve after overrieding the getItemViewType method @Override public int getItemViewType(int position) { return position; }
– Zahoor Saleem
Nov 27 '18 at 11:13
@ZahoorSaleem please post your comment as the answer, it did work for me. Also could you provide me any logical explanation how it worked? I read documentation for this method, it is clear for me but I don't understand why it changed behaviour of Switch.
– Domin
Nov 27 '18 at 12:22
add a comment |
i'm not sure, but since you are using RecyclerView, i guess you are doing wrong with OnCheckChangeListener. maybe you are setting OnCheckChangeListener at onCreateViewHolder and when ViewHolder has been reused, it uses previous data to update database.
– yeonseok.seo
Nov 27 '18 at 6:01
@yeonseok.seo I've updated my adapter code. I'm setting onCheckChangeListener insideonBindViewHolder
method
– Domin
Nov 27 '18 at 10:50
1
hope this resolve after overrieding the getItemViewType method @Override public int getItemViewType(int position) { return position; }
– Zahoor Saleem
Nov 27 '18 at 11:13
@ZahoorSaleem please post your comment as the answer, it did work for me. Also could you provide me any logical explanation how it worked? I read documentation for this method, it is clear for me but I don't understand why it changed behaviour of Switch.
– Domin
Nov 27 '18 at 12:22
i'm not sure, but since you are using RecyclerView, i guess you are doing wrong with OnCheckChangeListener. maybe you are setting OnCheckChangeListener at onCreateViewHolder and when ViewHolder has been reused, it uses previous data to update database.
– yeonseok.seo
Nov 27 '18 at 6:01
i'm not sure, but since you are using RecyclerView, i guess you are doing wrong with OnCheckChangeListener. maybe you are setting OnCheckChangeListener at onCreateViewHolder and when ViewHolder has been reused, it uses previous data to update database.
– yeonseok.seo
Nov 27 '18 at 6:01
@yeonseok.seo I've updated my adapter code. I'm setting onCheckChangeListener inside
onBindViewHolder
method– Domin
Nov 27 '18 at 10:50
@yeonseok.seo I've updated my adapter code. I'm setting onCheckChangeListener inside
onBindViewHolder
method– Domin
Nov 27 '18 at 10:50
1
1
hope this resolve after overrieding the getItemViewType method @Override public int getItemViewType(int position) { return position; }
– Zahoor Saleem
Nov 27 '18 at 11:13
hope this resolve after overrieding the getItemViewType method @Override public int getItemViewType(int position) { return position; }
– Zahoor Saleem
Nov 27 '18 at 11:13
@ZahoorSaleem please post your comment as the answer, it did work for me. Also could you provide me any logical explanation how it worked? I read documentation for this method, it is clear for me but I don't understand why it changed behaviour of Switch.
– Domin
Nov 27 '18 at 12:22
@ZahoorSaleem please post your comment as the answer, it did work for me. Also could you provide me any logical explanation how it worked? I read documentation for this method, it is clear for me but I don't understand why it changed behaviour of Switch.
– Domin
Nov 27 '18 at 12:22
add a comment |
1 Answer
1
active
oldest
votes
your problem is row item duplication in recycler view overried the getItemViewType method, hope this works for you.
@Override
public int getItemViewType(int position) {
return position;
}
add a comment |
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481868%2fswitch-changes-its-behaviour-when-there-are-more-than-5-items-in-recyclerview%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
your problem is row item duplication in recycler view overried the getItemViewType method, hope this works for you.
@Override
public int getItemViewType(int position) {
return position;
}
add a comment |
your problem is row item duplication in recycler view overried the getItemViewType method, hope this works for you.
@Override
public int getItemViewType(int position) {
return position;
}
add a comment |
your problem is row item duplication in recycler view overried the getItemViewType method, hope this works for you.
@Override
public int getItemViewType(int position) {
return position;
}
your problem is row item duplication in recycler view overried the getItemViewType method, hope this works for you.
@Override
public int getItemViewType(int position) {
return position;
}
answered Nov 28 '18 at 4:34
Zahoor SaleemZahoor Saleem
32229
32229
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481868%2fswitch-changes-its-behaviour-when-there-are-more-than-5-items-in-recyclerview%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
i'm not sure, but since you are using RecyclerView, i guess you are doing wrong with OnCheckChangeListener. maybe you are setting OnCheckChangeListener at onCreateViewHolder and when ViewHolder has been reused, it uses previous data to update database.
– yeonseok.seo
Nov 27 '18 at 6:01
@yeonseok.seo I've updated my adapter code. I'm setting onCheckChangeListener inside
onBindViewHolder
method– Domin
Nov 27 '18 at 10:50
1
hope this resolve after overrieding the getItemViewType method @Override public int getItemViewType(int position) { return position; }
– Zahoor Saleem
Nov 27 '18 at 11:13
@ZahoorSaleem please post your comment as the answer, it did work for me. Also could you provide me any logical explanation how it worked? I read documentation for this method, it is clear for me but I don't understand why it changed behaviour of Switch.
– Domin
Nov 27 '18 at 12:22