简体   繁体   English

滚动后,自定义ListView始终未选中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM