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

时间:2011-01-06 06:45:26

标签: android listview

朋友,

我使用以下自定义适配器在listview中显示textview和checboxes。 现在如果textview是selectAll on click checbox infront in list in list我应该选择下面列表中的所有复选框。 在我的情况下,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`

3 个答案:

答案 0 :(得分:1)

回答你的主要问题......你应该做的是迭代存储的数据(List obj)并将值设置为true,然后调用notifyDataSetChanged()。

然而,你应该解决的(有些具有讽刺意义的)EfficientAdapter存在许多问题。

首先,您正在使用ViewHolder模式,但这在此处完全没用,因为您忽略了convertView参数并且每次都从头开始创建新视图。由于您的视图永远不会被重用,因此视图持有者不会为您执行任何操作。如果convertView为null,则只应给新视图充气。

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

我强烈建议您通过Google I / O在ListViews上观看此视频:http://developer.android.com/videos/index.html#

答案 1 :(得分:0)

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

在onCreate()方法

之外声明此数组
private boolean[] itemToggled;

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

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;
        }

}       

使用此数组中的值来处理复选框。

答案 2 :(得分:0)

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);
                }
        }
    });

享受并保持安慰...