Android 如何以编程方式选择自定义列表适配器中的所有复选框?

Android 如何以编程方式选择自定义列表适配器中的所有复选框?,android,listview,Android,Listview,朋友们 我使用以下自定义适配器在listview中显示textview和复选框。 现在,若在单击列表中文本视图前面的复选框时选择了全部,我应该选中列表中下面的所有复选框。 在我的情况下,selectall复选框将位于位置“0”处,其他复选框位于其下方 任何一个都可以指导我如何获取所有复选框数组,以便我可以选择或取消选择它们。 任何帮助都将不胜感激 public class EfficientAdapter extends BaseAdapter implements Filte

朋友们

我使用以下自定义适配器在listview中显示textview和复选框。 现在,若在单击列表中文本视图前面的复选框时选择了全部,我应该选中列表中下面的所有复选框。 在我的情况下,selectall复选框将位于位置“0”处,其他复选框位于其下方

任何一个都可以指导我如何获取所有复选框数组,以便我可以选择或取消选择它们。 任何帮助都将不胜感激

public  class EfficientAdapter extends BaseAdapter implements
        Filterable {
    private LayoutInflater mInflater;
    //private Context context;
    List<DalCategories> obj;

    public EfficientAdapter(Context context,List<DalCategories> value) {

        mInflater = LayoutInflater.from(context);
        obj = value;
        //this.context = context;
    }

    public View getView(final int position, View convertView,
         final  ViewGroup parent) {
        ViewHolder holder;

        convertView = mInflater.inflate(R.layout.list_category_item, null);

        holder = new ViewHolder();
        holder.TextTitle = (TextView) convertView.findViewById(R.id.list_item_title);
        holder.checkBoxes = (CheckBox) convertView.findViewById(R.id.chkSubCategory);


        if(obj.get(position).isIs_Selected())
        {
            holder.checkBoxes.setChecked(true);
        }


        holder.checkBoxes
        .setOnCheckedChangeListener(new OnCheckedChangeListener() {

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

                if(select_all == true)
{               
                // select all here........


}                   


            }
        });

        convertView.setTag(holder);


        holder.TextTitle.setText(obj.get(position).getTitle());



        return convertView;
    }

     class ViewHolder 
     {
        public TextView TextTitle;
        public CheckBox checkBoxes;
     }

    @Override
    public Filter getFilter() {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public int getCount() {
        return obj.size();
    }

    @Override
    public Object getItem(int position) {
        return obj.get(position);
    }

    }`enter code here`
公共类EfficientAdapter扩展BaseAdapter实现
可过滤{
私人停车场;
//私人语境;
列出obj;
公共效率适配器(上下文、列表值){
mInflater=LayoutInflater.from(上下文);
obj=值;
//this.context=上下文;
}
公共视图getView(最终整型位置,视图转换视图,
最终视图组(父视图){
视窗座;
convertView=mInflater.充气(R.layout.list\u category\u item,空);
holder=新的ViewHolder();
holder.TextTitle=(TextView)convertView.findViewById(R.id.list\u item\u title);
holder.CheckBox=(复选框)convertView.findViewById(R.id.chkSubCategory);
if(obj.get(position.isIs_Selected())
{
holder.checkbox.setChecked(true);
}
复选框
.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(
复合按钮视图,布尔值已选中){
如果(选择_all==true)
{               
//在此处选择全部。。。。。。。。
}                   
}
});
convertView.setTag(支架);
holder.TextTitle.setText(obj.get(position.getTitle());
返回视图;
}
类视图持有者
{
公共文本视图文本标题;
公共复选框;
}
@凌驾
公共过滤器getFilter(){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
public int getCount(){
返回obj.size();
}
@凌驾
公共对象getItem(int位置){
返回对象获取(位置);
}
}`在这里输入代码`

您需要一个全局布尔数组来存储复选框的状态

在onCreate()方法外部声明此数组

并在onCreate()方法中初始化它,如下所示

itemToggled = new boolean[Checkbox.length];
int i;
        for(i=0;i<Checkbox.length;i++)
        {
            itemToggled[i]=false;
        }
itemToggled=new boolean[Checkbox.length];
int i;

对于(i=0;i要回答您的主要问题,您应该迭代存储的数据(List obj)并将值设置为true,然后调用notifyDataSetChanged()

然而,您的(有点讽刺的名字)效率适配器有许多问题需要解决

首先,您使用的是ViewHolder模式,但这在这里完全没有用,因为您每次都忽略convertView参数并从头开始创建一个新视图。由于您的视图从未被重用,ViewHolder不会为您做任何事情。您只应在convertView为null时膨胀一个新视图

其次,似乎只有在单击第一个项目时才有一个单击操作,但您正在为每个项目创建和设置处理程序。您可以通过将该检查移到外部,而不是将一个有效的无操作事件处理程序附加到除一个元素之外的所有元素,从而提高代码的效率

我强烈建议您在google I/O的ListView上观看此视频:

selectAllButton.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v)
{
Log.i(“子项计数”,“myListView.getCount()+”选中MyList中的项”);
对于(int i=0;i
itemToggled = new boolean[Checkbox.length];
int i;
        for(i=0;i<Checkbox.length;i++)
        {
            itemToggled[i]=false;
        }
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(select_all == true)
{               
                // select all here........
        int i;
        for(i=0;i<Checkbox.length;i++)
        {
            itemToggled[i]=true;
        }

}       
selectAllButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) 
        {
            Log.i("Children Count",""+myListView.getCount()+"Items from MyList Checked");
                for(int i=0;i<myListView.getCount();i++)
                {
                    myListView.setItemChecked(i,true);
                }
        }
    });