cbChecked.setOnCheckedChangeListener(new OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
FaxDialogActivity.record.get(position).isChecked = true;
}
});
but when i check the one checkbox, multiple checkboxes get selected after scrolling the listview.
This is because getview is called everytime the view recycles while scrolling a list view.So u have store a value and check it in getview to get checked checkbox.
Try this
1> Create an ArrayList of Boolean Object to store the state of the each CheckBox
2> Initializes the ArrayList items to default value false, means no CheckBox is checked yet.
3>When you click on CheckBox. Set a check against Checked/Unchecked state and store that value in ArrayList.
Now set that position to CheckBox using setChecked() method.
for complete code please refer THIS ANSWER and this BLOG
Related
I have a custom list view and each item of it has a check box and a text field. I want to disable the check box in every other row of the list view if the check box of the first row is enabled.
Since you are stating that if the first check box is clicked all the others should be disabled, do a check in your onBindView() to see if the checkbox is checked. if it is, set a value to say that it is, and for all the following list view entries set the checkbox to disabled.
In your onCheckChangedListener():
checkbox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked()){
firstCheckboxChecked = true;
}
});
Then in your onBindView for the rest:
if(firstCheckBoxChecked){
checkbox.setEnabled(false);
}
Here I am putting some rough solution which will help you.
classs model
{
boolean status;
model(boolean status){
this.status=status;
}
}
List<model> list_model= new ArrayList<>();
list_model.add(false);
list_model.add(false);
list_model.add(false);
list_model.add(false);
add this model with listview adapter.
//Adapter coding
checkbox.checked(check)
//write below code in checkbox.setOncheckedItemSelect method.
//you will get already checked parameter in that method.which will put into list
list_model.add(checked);
//here call listview notify datasetchangedListener.
create a boolean variable isFirstEnbled in your adapter. then on click first item's checkbox set this value as isFirstEnbled=true .
adapter.notifyDataSetChanged()
This recreate the view with isFirstEnabled set as true
I've placed a checkbox in a custom array adapter of an listview. The adapter works fine when I check the checkbox. But when I try to uncheck the checkbox in a random manner the application throws.
Here's my code for your reference:
holder1.chckbx1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if (isChecked) {
Log.i("checked", "checked");
positionArray.set(position, true);
broadCastDetailsLists.add(new BroadCastDetailsList(cpsId2, cpsType2, position, cpsName,handShakeStatus, favouriteStatus));
sendEnquiry.add(new Q2_SendEnquiryList(searchresultList.get(position).getCpsId(), searchresultList.get(position).getCpsName()));
} else {
Log.i("unchecked", "unchecked");
positionArray.set(position, false);
broadCastDetailsLists.remove(position);
sendEnquiry.remove(position);
}
}
});
Also here's my log for your reference
It's an issue with your logic. When checking a checkbox you'll just add data to lists, while removing an index when unchecking.
Say you check the item at position 1. broadCastDetailsLists and sendEnquiry now have a size of 1. If you uncheck the same checkbox, you remove position 1, thus the IndexOutOfBoundsException.
Make Sure your ArrayList data not found or null , print the list data first and check data .
Could someone please explain the different ways of making checkbox list and saving the checked option? It would be nice if you could attach examples. I am using arraylist to save input, what are the other ways?
final CharSequence[] items = {};
final ArrayList seletedItems = new ArrayList();
Define your ListItem object to have a 'checked' field
class ListItem{
boolean isChecked=false;
}
In your list adapter's getView attach a onCheckedChangeListener to the CheckBox and change the checked state of your object. something like:
final MessageItem Message=getItem(position);
message.setText(Message.text);
//set data
select.setOnCheckedChangeListener(null); //important so that when reusing the view the old listener isn't called
select.setChecked(Message.selected);
select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
Message.selected=isChecked;
}
});
You can create a custom class for objects like,
public class entity
{
public boolean isChecked;
//Any other variables can also be created
}
On check box selection change the value of
entityobj[index].isChecked=true/false;
Apply a custom list adapter,
in adapters getview() method you can check for isChecked value and then either check or uncheck the respective checkbox,
using this your selection will persist while scrolling also..
Hope it will help...
I am using ToggleButtons in a listview, and I set the state of togglebutton from the webservice data, now I changed the state of togglebutton, but it is reset to previous when I scrolling the listview.
I used the following in my adapter class.
tbtnStatus=(ToggleButton)view.findViewById(R.id.togglebtn);
tbtnStatus.setTag(new Integer(position));
tbtnStatus.setOnCheckedChangeListener(null);
tbtnStatus.setOnCheckedChangeListener(new OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
String update_status;
String current_status=buttonView.getText().toString();
if(current_status.equals("ON"))
{
update_status="NO";
}
else
{
update_status="YES";
}
String res=UrltoValue.getValuefromUrl(DataUrls.updateindividualstaus+"?pilotid="+DataUrls.pilotid+"&friendid="+friendid[position]+"&status="+update_status);
}
});
State of your toggle button will be cleared to it's default value from webservice data each time when you sroll it out of the screen, because views of all not currently visible rows are deleted and will be recreated with default values. You need to save state of you toggle button. For example, you can save it in object associated with this row if you use ArrayAdapter<Object>.
save your position of View when u check the toggle button of that respective view...and in getView() write this code
if(yourposition==position)
tbtnStatus.setChecked(true);
Suppose you clicked 3rd position toggle..save 3 as yourposition and when u will scroll getView gets called and will satify the condition checking your toggle to yes
Iv'e got a custom Listview implemented in this particular class, it looks like
[Image/Textview/Checkbox]
When someone clicks on the text is should launch another class, this is working at the moment, however when someone clicks a checkbox I want to update an array that stores the current state of all the checkboxes, I tried doing that via using a onCheckedChanged method within the custom adapter however it doesn't work as the position variable isn't final. So two questions
1 within the adapter is their a way to get the position of the Checkbox so I can change the right position in the array, and
2 If not is their another way to update the array somewhere else without disrupting the current functionality of the onClick.
Here is my onCheckedChanged within my adapter
CheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
#Override
public void onCheckedChanged(CompoundButton but, boolean b) {
// TODO Auto-generated method stub
if(but.isChecked())
{
deleteList[???] = true;
}else{
deleteList[???] = false;
}
}
});
Have a look a this method. You can set a tag to a view containing any object you wish, which in your case may be the integer value associated with the CheckBox's row.
So when you create your CheckBox:
but.setTag(new Integer(position));
This would change your if statement to:
if (but.isChecked()){
deleteList[((Integer) but.getTag()).intValue()] = true;
} else {
deleteList[((Integer) but.getTag()).intValue()] = false;
}
Let me know if this helps!