[英]Custom ListView always gets unchecked after scrolling over
I created an app is working with custom ListView
. 我创建了一个应用程序正在使用自定义
ListView
。 In the custom, ListView
have Checkbox
option. 在自定义中,
ListView
具有Checkbox
选项。 When I scroll up or down over the phone screen Checkbox got unchecked automatically. 当我在电话屏幕上向上或向下滚动时,Checkbox自动取消选中。 Do you have any solution on this case?
你对这个案子有什么解决方案吗? Please help to solve this issue.
请帮忙解决这个问题。 Thanks!
谢谢!
customelist.xml customelist.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".menu_list">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textViewItemName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginStart="10dp"
android:layout_toEndOf="@+id/buttonBarcode"
android:fontFamily="serif"
android:text="Medium Text"
android:textColor="@android:color/holo_red_dark"
android:textSize="18sp"
android:textStyle="bold" />
<CheckBox
android:id="@+id/checkboxList"
android:layout_width="32dp"
android:layout_height="30dp"
android:layout_alignParentEnd="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginEnd="30dp"
android:background="@drawable/button_round_green"
android:textAlignment="center"
android:textColorHint="@android:color/holo_red_dark"
android:textColorLink="@android:color/holo_red_dark" />
</RelativeLayout>
</RelativeLayout>
ListAdapter.java ListAdapter.java
public class listAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] index_item;
private final String[] barcode_food;
private final String[] item_name;
private final String[] price_item;
//private TextView textView_name, textView_price;
//private Button button_index, button_barcode;
//private CheckBox checkBoxItem;
public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) {
super(context, R.layout.activity_menu_list, index_item);
this.context = context;
this.index_item = index_item;
this.barcode_food = barcode_food;
this.item_name = item_name;
this.price_item = price_item;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);
TextView textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);
final CheckBox checkBoxItem = (CheckBox) rowView.findViewById(R.id.checkboxList);
textView_name.setText(item_name[position]);
// Row View got click
rowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBoxItem.isChecked()==true){
checkBoxItem.setChecked(false);
}
else checkBoxItem.setChecked(true);
}
});
// Return row view
return rowView;
}
You need to modified like: 你需要修改像:
private final Activity context;
private final String[] index_item;
private final String[] barcode_food;
private final String[] item_name;
private final String[] price_item;
//add Array
private final String[] selectedItems;
//private TextView textView_name, textView_price;
//private Button button_index, button_barcode;
//private CheckBox checkBoxItem;
public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) {
super(context, R.layout.activity_menu_list, index_item);
this.context = context;
this.index_item = index_item;
this.barcode_food = barcode_food;
this.item_name = item_name;
this.price_item = price_item;
// Loop to set all the items are unselected
for(int i=0;i<index_item.lenght();i++){
selectedItems[i] = false;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);
TextView textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);
final CheckBox checkBoxItem = (CheckBox) rowView.findViewById(R.id.checkboxList);
textView_name.setText(item_name[position]);
if (selectedItems[position]){
checkBoxItem.setChecked(true);
}
else checkBoxItem.setChecked(false);
// Row View got click
rowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(selectedItems[position]){
selectedItems[position]= false;
}else{
selectedItems[position]= true;
}
notifydatasetchanged
}
});
// Return row view
return rowView;
}
You have to Maintain Checkbox Array Selection Like below : 您必须维护Checkbox阵列选择如下所示:
private final Boolean [] buttonCheckedState; private final Boolean [] buttonCheckedState;
Your constructor Should like this: 你的构造函数应该是这样的:
public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) { public listAdapter(Activity context,String [] index_item,String [] barcode_food,String [] item_name,String [] price_item){
super(context, R.layout.activity_menu_list, index_item);
this.context = context;
this.index_item = index_item;
this.barcode_food = barcode_food;
this.item_name = item_name;
this.price_item = price_item;
for(int i=0;i<index_item.lenght();i++){
buttonCheckedState[i] = false;
}
} }
put this code in get View: 将此代码放入get View:
checkBoxItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { checkBoxItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
buttonCheckedState[position]=buttonView.isChecked(); // Set the value of checkbox to maintain its state.
}
});
checkBoxItem .setTag(position); // This line is important.
checkBoxItem.setChecked(buttonCheckedState[position]);
Something like this 像这样的东西
private final Activity context;
private final String[] index_item;
private final String[] barcode_food;
private final String[] item_name;
private final String[] price_item;
private boolean[] checkboxes;
//private TextView textView_name, textView_price;
//private Button button_index, button_barcode;
//private CheckBox checkBoxItem;
public listAdapter(Activity context, String[] index_item, String[] barcode_food, String[] item_name, String[] price_item) {
super(context, R.layout.activity_menu_list, index_item);
this.context = context;
this.index_item = index_item;
this.barcode_food = barcode_food;
this.item_name = item_name;
this.price_item = price_item;
this.checkboxes = new boolean[index_item.length];
for(i = 0; i < checkboxes.length; i++)
checkboxes[i] = false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);
TextView textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);
final CheckBox checkBoxItem = (CheckBox) rowView.findViewById(R.id.checkboxList);
textView_name.setText(item_name[position]);
checkBoxItem.setChecked(checkboxes[position]);
// Row View got click
rowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkboxes[position] = !checkboxes[position];
checkBoxItem.setChecked(checkboxes[position]);
/*if (checkBoxItem.isChecked()==true){
checkBoxItem.setChecked(false);
}
else checkBoxItem.setChecked(true);*/
}
});
// Return row view
return rowView;
}
try this....i have modified your code 试试这个....我修改了你的代码
try this....
if(rowciew==null){
ViewHolder viewholder;
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.activity_menu_list,null,true);
viewholder=new ViewHolder();
viewholder.textView_name = (TextView) rowView.findViewById(R.id.textViewItemName);
viewholder.checkBoxItem = (CheckBox)rowView.findViewById(R.id.checkboxList);
rowView.setTag(viewholder);
}else{
viewholder=(ViewHolder) rowview.getTag();
}
textView_name.setText(item_name[position]);
// Row View got click
rowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewholder.checkBoxItem.isChecked()==true){
viewholder.checkBoxItem.setChecked(false);
}
else viewholder.checkBoxItem.setChecked(true);
}
});
// Return row view
return rowView;
private class ViewHolder {
TextView textView_name;
CheckBox checkBoxItem;
}
} }
Seems you are missing preserving the state of checkboxes. 似乎你缺少保留复选框的状态。 Each time an item is visible during scroll, Android re-renders it.
每次在滚动期间看到项目时,Android都会重新呈现它。 Try like
试试吧
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
//Inflate Single View
View v= View.inflate(context, R.layout.row_item, null);
//Bind Components
TextView textView_name = (TextView) v.findViewById(R.id.textViewItemName);
CheckBox checkBoxItem = (CheckBox) v.findViewById(R.id.checkboxList);
//Populate Componengts
textView_name.setText(item_name[position]);
//Identify Checkbox clicks
checkBoxItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
{
//Save checked data somewhere after checking isChecked()
}
});
//Check checkbox state here
if(checkBoxItem.isChecked())
{
checkBoxItem.setChecked(true);
}
else
{
checkBoxItem.setChecked(false);
}
//Return View
return v;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.