2011-01-06 86 views
1

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

我正在使用下面的自定义适配器在列表视图中显示textview和checboxes。 现在如果textview是selectAll单击checbox在它的列表中,我应该选择列表中下面的所有复选框。 在我的案例中,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` 

回答

1

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

然而,您应该解决的问题(有点讽刺地命名)EfficientAdapter存在很多问题。

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

其次,看起来你只有在点击第一个项目时才会点击,但是你正在创建和设置每个项目的处理程序。只需将外部支票移到外面,而不是将有效的不操作事件处理程序附加到除您的一个元素之外的所有元素,就可以使代码更高效。

我强烈建议你去/在列表视图这段视频来自谷歌I O:http://developer.android.com/videos/index.html#

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

}  

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

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

享受和保持androiding ...

相关问题