Android 是否选中自定义listview中的复选框并保持其状态?

Android 是否选中自定义listview中的复选框并保持其状态?,android,android-listview,custom-lists,Android,Android Listview,Custom Lists,我使用下面的代码来维护复选框状态,但它不起作用。我只想要两个复选框被选中 public class CACompareList extends ArrayAdapter<CompareListData>{ public static int count = 0; public LayoutInflater inflater; public static ArrayList<CompareListData> selectedId; publ

我使用下面的代码来维护复选框状态,但它不起作用。我只想要两个复选框被选中

public class CACompareList extends ArrayAdapter<CompareListData>{

    public static int count = 0;
    public LayoutInflater inflater;
    public static ArrayList<CompareListData> selectedId;
    public ArrayList<CompareListData> listObjects;
    Context contex;
    public CACompareList(Context context, int textViewResourceId,
            ArrayList<CompareListData> objects) {
        super(context, textViewResourceId, objects);
        this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.listObjects = objects;
        selectedId = new ArrayList<CompareListData>();
        this.contex = context;
    }
    public static class ViewHolder
    {   
        TextView txtViewLoanName;
        TextView txtViewHtmlString;
        CheckBox chkSelected;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if(convertView==null)
        {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.row_comparelist, null);

            holder.txtViewLoanName= (TextView) convertView.findViewById(R.id.rowcomparelist_tv_loanname);
            holder.txtViewHtmlString= (TextView) convertView.findViewById(R.id.rowcomparelist_tv_loandetail);
            holder.chkSelected= (CheckBox) convertView.findViewById(R.id.rowcomparelist_chk_selected);
            convertView.setTag(holder);
        }
        else{
            holder=(ViewHolder)convertView.getTag();
        }

        final CompareListData data = this.listObjects.get(position);

        holder.txtViewLoanName.setText(this.listObjects.get(position).getLoanName());
        holder.txtViewHtmlString.setText(Html.fromHtml(this.listObjects.get(position).getHtmlString()));


        holder.chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                //listObjects.get(position).setSelected(isChecked);
                if(isChecked){
                    count++;

                }else{
                    count--;
                    selectedId.remove(data);
                }
                if(count >= 3)// it will allow 3 checkboxes only
                {
                    Toast.makeText(contex, "Select only two Loan", Toast.LENGTH_LONG).show();
                    buttonView.setChecked(false);
                    count--;
                }
                else
                {
                    selectedId.add(data);
                    buttonView.setSelected(isChecked);
                    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                    listObjects.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                    Log.e("Selected Position is:", String.valueOf(getPosition));
                }
            }
        });
        holder.chkSelected.setTag(position);
        holder.chkSelected.setSelected(this.listObjects.get(position).getSelected());
        Log.e("Position is:", String.valueOf(position));
        return convertView;
    }

}
公共类CACompareList扩展了ArrayAdapter{
公共静态整数计数=0;
公共场所;充气机;
公共静态数组列表selectedId;
公共数组列表对象;
语境语境;
公共CACompareList(上下文,int textViewResourceId,
ArrayList对象){
超级(上下文、textViewResourceId、对象);
this.inflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u inflater\u SERVICE);
this.listObjects=对象;
selectedId=newarraylist();
this.contex=上下文;
}
公共静态类视图持有者
{   
TextView txtViewLoanName;
TextView txtViewHtmlString;
复选框chkSelected;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null)
{
holder=新的ViewHolder();
convertView=充气机。充气(R.layout.row\u比较列表,空);
holder.txtViewLoanName=(TextView)convertView.findViewById(R.id.rowcomparelist\u tv\u loanname);
holder.txtViewHtmlString=(TextView)convertView.findViewById(R.id.rowcomparelist\u tv\u loandDetail);
holder.chkSelected=(复选框)convertView.findViewById(R.id.rowcomparelist\u chk\u selected);
convertView.setTag(支架);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
final CompareListData data=this.listObjects.get(位置);
holder.txtViewLoanName.setText(this.listObjects.get(position.getLoanName());
holder.txtViewHtmlString.setText(Html.fromHtml(this.listObjects.get(position.getHtmlString());
holder.chkSelected.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//listObjects.get(position).setSelected(isChecked);
如果(已检查){
计数++;
}否则{
计数--;
选择edid.删除(数据);
}
if(count>=3)//只允许3个复选框
{
Toast.makeText(contex,“仅选择两个贷款”,Toast.LENGTH_LONG.show();
buttonView.setChecked(假);
计数--;
}
其他的
{
选择edid.add(数据);
按钮视图设置已选中(已选中);
int getPosition=(Integer)buttonView.getTag();//这里我们使用setTag获取为复选框设置的位置。
listObjects.get(getPosition).setSelected(buttonView.isChecked());//设置复选框的值以保持其状态。
Log.e(“所选位置为:”,String.valueOf(getPosition));
}
}
});
holder.chkSelected.setTag(位置);
holder.chkSelected.setSelected(this.listObjects.get(position.getSelected());
Log.e(“位置为:”,String.valueOf(位置));
返回视图;
}
}
当我选中第一个复选框,然后向下和向上滚动时,我会得到不同的结果。我的第一个复选框被取消选中,另一个复选框被选中

我还检查了listView项目click listner,但它对我也没有帮助

lvLoanLiat.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                if(IN_EDIT_MODE == false){
                    CompareListData data = (CompareListData)arg0.getItemAtPosition(arg2);

                    CheckBox cBox = (CheckBox) arg1.findViewById(R.id.rowcomparelist_chk_selected);
                    if(cBox.isChecked()){
                        count--;
                        selectedId.remove(data);
                    }else{
                        count++;
                    }
                    if(count >= 3)// it will allow 3 checkboxes only
                    {
                        Toast.makeText(CompareListActivity.this, "Select only two Loan", Toast.LENGTH_LONG).show();
                        cBox.setChecked(false);
                        count--;
                    }
                    else
                    {
                        selectedId.add(data);
                        cBox.setSelected(true);
                        data.setSelected(true);
                        Log.e("Selected Position is:", String.valueOf(arg2));
                    }
                }

            }
        });
lvLoanLiat.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
如果(在编辑模式下==false){
CompareListData=(CompareListData)arg0.getItemAtPosition(arg2);
复选框cBox=(复选框)arg1.findViewById(R.id.rowcomparelist\u chk\u选中);
if(cBox.isChecked()){
计数--;
选择edid.删除(数据);
}否则{
计数++;
}
if(count>=3)//只允许3个复选框
{
Toast.makeText(comparelistativity.this,“仅选择两个贷款”,Toast.LENGTH\u LONG.show();
cBox.setChecked(false);
计数--;
}
其他的
{
选择edid.add(数据);
cBox.setSelected(true);
选择的数据集(真);
Log.e(“所选位置为:”,String.valueOf(arg2));
}
}
}
});
下面是第一个屏幕截图,我只检查了第一个项目,如下面的屏幕截图。

然后我上下滚动,结果如下图所示

谢谢

您是否尝试过使用:

希望这有帮助。如果没有,请告诉我。

在getView()中,您应该首先取消设置侦听器

holder.chkSelected.setOnCheckedChangeListener(null);
holder.chkSelected.setSelected(isSelected);

也许能帮助你。请注意第622行。

。检查一下这个可能help@Raghunandan我看到了它,但它对我没有帮助。为什么它对您没有帮助?我在listView中遇到问题,滚动不在活动中。UI已绑定到活动中。您是否尝试过使用上述参数。参数已被使用,我已经看到了,但仍然无法帮助我得到正确的结果。@GirishBhutiya也许你应该将setTag()放在buttonView.getTag()之前,但是我认为没有必要使用setTag(位置),值getPosition alawys等于位置