[英]Custom ListView always gets unchecked after scrolling over
我创建了一个应用程序正在使用自定义ListView
。 在自定义中, ListView
具有Checkbox
选项。 当我在电话屏幕上向上或向下滚动时,Checkbox自动取消选中。 你对这个案子有什么解决方案吗? 请帮忙解决这个问题。 谢谢!
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
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;
}
你需要修改像:
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;
}
您必须维护Checkbox阵列选择如下所示:
private final Boolean [] buttonCheckedState;
你的构造函数应该是这样的:
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;
}
}
将此代码放入get View:
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]);
像这样的东西
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....
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;
}
}
似乎你缺少保留复选框的状态。 每次在滚动期间看到项目时,Android都会重新呈现它。 试试吧
@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.