Android listview中的复选框工作不正常

Android listview中的复选框工作不正常,android,Android,我正在为listview的每个Iten实现listview复选框。我遇到的问题是,当我单击任何单个复选框时,当我滚动其他未单击的复选框时,也会随机单击。我上过很多链接,所以没能解决我的问题 public class CustomListViewAdapter extends ArrayAdapter<Client> { ViewHolder holder = null; private LayoutInflater inflator = null; private ArrayLis

我正在为listview的每个Iten实现listview复选框。我遇到的问题是,当我单击任何单个复选框时,当我滚动其他未单击的复选框时,也会随机单击。我上过很多链接,所以没能解决我的问题

public class CustomListViewAdapter extends ArrayAdapter<Client> {

ViewHolder holder = null;
private LayoutInflater inflator = null;
private ArrayList<Client> orderList = null;
ArrayList<View> allViews;

public CustomListViewAdapter(Context context, int resource,
        List<Client> objects) {
    super(context, resource, objects);

    orderList = (ArrayList<Client>) objects;
    inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    allViews = new ArrayList<View>();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null) {
        convertView = inflator.inflate(R.layout.listview_add_order, null);
        holder = new ViewHolder();
        convertView.setTag(holder);
        holder.txtViewName = (TextView) convertView.findViewById(R.id.txtViewAddOrder);
        holder.spinnerAddorder = (Spinner) convertView.findViewById(R.id.spinnerAddOrder);
        holder.checkAddorder = (CheckBox) convertView.findViewById(R.id.checkAddOrder);
        holder.checkAddorder.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();


        holder.checkAddorder.setTag(holder);
    }

    allViews.add(position, holder.spinnerAddorder);

    holder.checkAddorder.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
            CheckBox cchk = (CheckBox)view;
            ViewHolder checkPosition = (ViewHolder) view.getTag();


            if(cchk.isChecked()) {

                checkPosition.spinnerAddorder.setVisibility(View.VISIBLE);

            } else {
                checkPosition.spinnerAddorder.setVisibility(View.INVISIBLE);
            }
        }
    });

    List<String> list = new ArrayList<String>();
    list.add("Select Quantity");
    list.add("1");
    list.add("2");
    list.add("3");
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this.getContext(),R.layout.spinner_add_order_style, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
    holder.spinnerAddorder.setAdapter(dataAdapter);

    if(holder.checkAddorder.isChecked()) {


        ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag();
        checkPosition.spinnerAddorder.setVisibility(View.VISIBLE);
    } else {

        ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag();
        checkPosition.spinnerAddorder.setVisibility(View.INVISIBLE);
    }


    Client order = orderList.get(position);

    holder.txtViewName.setText(order.getFirstName());
    return  convertView;
}

private static class ViewHolder {
    public TextView txtViewName = null;
    public Spinner spinnerAddorder = null;
    public CheckBox checkAddorder = null;
}

     }
公共类CustomListViewAdapter扩展了ArrayAdapter{
ViewHolder=null;
专用充气机=空;
私有ArrayList orderList=null;
ArrayList AllView;
公共CustomListViewAdapter(上下文、int资源、,
列出对象){
超级(上下文、资源、对象);
orderList=(ArrayList)对象;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
allViews=newarraylist();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=充气机。充气(R.layout.listview\u添加顺序,空);
holder=新的ViewHolder();
convertView.setTag(支架);
holder.txtViewName=(TextView)convertView.findViewById(R.id.txtViewAddOrder);
holder.spinneradorder=(微调器)convertView.findViewById(R.id.spinneradorder);
holder.checkAddorder=(复选框)convertView.findViewById(R.id.checkAddorder);
holder.checkAddorder.setTag(holder);
}否则{
holder=(ViewHolder)convertView.getTag();
holder.checkAddorder.setTag(holder);
}
所有视图.添加(位置,支架.旋转顺序);
holder.checkAddorder.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
复选框cchk=(复选框)视图;
ViewHolder checkPosition=(ViewHolder)view.getTag();
if(cchk.isChecked()){
checkPosition.spinneradorder.setVisibility(View.VISIBLE);
}否则{
checkPosition.spinneradorder.setVisibility(View.INVISIBLE);
}
}
});
列表=新的ArrayList();
列表。添加(“选择数量”);
列表。添加(“1”);
列表。添加(“2”);
列表。添加(“3”);
ArrayAdapter dataAdapter=新的ArrayAdapter(this.getContext(),R.layout.spinner\u add\u order\u style,list);
setDropDownViewResource(android.R.layout.simple\u微调器\u项);
holder.spinneradorder.setAdapter(数据适配器);
if(holder.checkAddorder.isChecked()){
ViewHolder checkPosition=(ViewHolder)holder.checkAddorder.getTag();
checkPosition.spinneradorder.setVisibility(View.VISIBLE);
}否则{
ViewHolder checkPosition=(ViewHolder)holder.checkAddorder.getTag();
checkPosition.spinneradorder.setVisibility(View.INVISIBLE);
}
客户订单=订单列表.get(位置);
holder.txtViewName.setText(order.getFirstName());
返回视图;
}
私有静态类视图持有者{
公共文本视图txtViewName=null;
公共微调器spinneradorder=null;
公共复选框checkAddorder=null;
}
}
我的xml文件是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:weightSum="2" >

<TextView
    android:id="@+id/txtViewAddOrder"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1.2"
    android:text="TextView"
    android:textSize="25sp" />

<Spinner
    android:id="@+id/spinnerAddOrder"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight=".8"
    android:background="@drawable/dropdown" />

<CheckBox
    android:id="@+id/checkAddOrder"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp" />

 </LinearLayout>

发生这种情况是因为视图回收。您需要做的是维护一个say boolean数组,并在每次选中复选框时切换相应的boolean。然后在getview中选中相应的布尔数组位置并设置复选框的状态

沿着这些思路:我对其进行了修改,使其正确显示。尚未检查代码的其余部分^_^

public class CustomListViewAdapter extends ArrayAdapter<Client> {

ViewHolder holder = null;
private LayoutInflater inflator = null;
private ArrayList<Client> orderList = null;
ArrayList<View> allViews;

boolean[] checkedStates; //********** NEW ********

public CustomListViewAdapter(Context context, int resource,
        List<Client> objects) {
    super(context, resource, objects);

    orderList = (ArrayList<Client>) objects;
    inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    allViews = new ArrayList<View>();

    checkedStates = new boolean[objects.size()]; //********** NEW ********
}

@Override   //********** NEW ******** position argument is now final 
public View getView(final int position, View convertView, ViewGroup parent) {
    if(convertView == null) {
        convertView = inflator.inflate(R.layout.listview_add_order, null);
        holder = new ViewHolder();
        convertView.setTag(holder);
        holder.txtViewName = (TextView) convertView.findViewById(R.id.txtViewAddOrder);
        holder.spinnerAddorder = (Spinner) convertView.findViewById(R.id.spinnerAddOrder);
        holder.checkAddorder = (CheckBox) convertView.findViewById(R.id.checkAddOrder);
        holder.checkAddorder.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();


        holder.checkAddorder.setTag(holder);
    }

    allViews.add(position, holder.spinnerAddorder);

    holder.checkAddorder.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {

              checkedStates[position] = !checkedStates[position]; //********** NEW ********
        }
    });

    holder.chechAddorder.setChecked(checkedStates[position]); //********** NEW ********

    List<String> list = new ArrayList<String>();
    list.add("Select Quantity");
    list.add("1");
    list.add("2");
    list.add("3");
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this.getContext(),R.layout.spinner_add_order_style, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
    holder.spinnerAddorder.setAdapter(dataAdapter);

    if(checkedStates[position]) { //********** NEWEST ******** assuming true is checked and false is unchecked


        ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag();
        checkPosition.spinnerAddorder.setVisibility(View.VISIBLE);
    } else {

        ViewHolder checkPosition = (ViewHolder) holder.checkAddorder.getTag();
        checkPosition.spinnerAddorder.setVisibility(View.INVISIBLE);
    }


    Client order = orderList.get(position);

    holder.txtViewName.setText(order.getFirstName());
    return  convertView;
}

private static class ViewHolder {
    public TextView txtViewName = null;
    public Spinner spinnerAddorder = null;
    public CheckBox checkAddorder = null;
}

     }
公共类CustomListViewAdapter扩展了ArrayAdapter{
ViewHolder=null;
专用充气机=空;
私有ArrayList orderList=null;
ArrayList AllView;
布尔[]检查状态;//**********新********
公共CustomListViewAdapter(上下文、int资源、,
列出对象){
超级(上下文、资源、对象);
orderList=(ArrayList)对象;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
allViews=newarraylist();
checkedStates=new boolean[objects.size()];//************new********
}
@Override//**********新*******位置参数现在是最终参数
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=充气机。充气(R.layout.listview\u添加顺序,空);
holder=新的ViewHolder();
convertView.setTag(支架);
holder.txtViewName=(TextView)convertView.findViewById(R.id.txtViewAddOrder);
holder.spinneradorder=(微调器)convertView.findViewById(R.id.spinneradorder);
holder.checkAddorder=(复选框)convertView.findViewById(R.id.checkAddorder);
holder.checkAddorder.setTag(holder);
}否则{
holder=(ViewHolder)convertView.getTag();
holder.checkAddorder.setTag(holder);
}
所有视图.添加(位置,支架.旋转顺序);
holder.checkAddorder.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
checkedStates[position]=!checkedStates[position];//**********新建********
}
});
holder.chechAddorder.setChecked(checkedStates[位置]);//**********新********
列表=新的ArrayList();
列表。添加(“选择数量”);
列表。添加(“1”);
列表。添加(“2”);
列表。添加(“3”);
ArrayAdapter dataAdapter=新的ArrayAdapter(this.getContext(),R.layout.spinner\u add\u order\u style,list);
setDropDownViewResource(android.R.layout.simple\u微调器\u项);
holder.spinneradorder.setAdapter(数据适配器);
如果(checkedStates[position]){//*************最新*******假设选中了true,而未选中了false
ViewHolder checkPosition=(ViewHolder)holder.checkAddorder.getTag();
checkPosition.spinneradorder.setVisibility(View.VISIBLE);
}否则{
ViewHolder checkPosition=(ViewHolder)holder.checkAddorder.getTag();
checkPosition.spinneradorder.setVisibility(Vi
{ <CheckBox
    android:id="@+id/cb_alert"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="5dip"
    android:button="@drawable/custom_checkbox"
    android:checked="true"
    android:focusable="false"
    android:padding="7dip" />}
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@={viewmodel.rememberMe}"
@Bindable
fun getRememberMe(): Boolean {
    return data.rememberMe
}

fun setRememberMe(value: Boolean) {
    // Avoids infinite loops.
    if (data.rememberMe != value) {
        data.rememberMe = value

        // React to the change.
        saveData()

        // Notify observers of a new value.
        notifyPropertyChanged(BR.remember_me)
    }
}
override fun getItemId(position: Int) = position.toLong()

override fun getItemViewType(position: Int) = position