2011-07-27 148 views
1

我有一个奇怪的问题与我的复选框。在我的适配器中,我有一个TextView,一个ImageView和一个CheckBox。我已经实现了一个按钮来选择全部/全部取消选择,一切正常。问题是,当我选择一个复选框,如果我滚动列表有选择其他复选框(他们之间的距离是10),我不明白为什么。谁能帮我?问题与复选框

这里是我的适配器:

public class LazyAdapter extends BaseAdapter { 

     private Activity activity; 
     private String[] data; 
     private String[] nume; 
     private LayoutInflater inflater = null; 
     public ImageLoader imageLoader; 

     public LazyAdapter(Activity a, String[] d, String[] f) { 
      activity = a; 
      data = d; 
      nume = f; 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      imageLoader = new ImageLoader(activity.getApplicationContext(),"Folder2"); 
     } 

     public int getCount() { 
      return data.length; 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public class ViewHolder { 
      public TextView text; 
      public ImageView image; 
      public CheckBox ck; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      View vi = convertView; 
      ViewHolder holder; 
      if (convertView == null) { 
       vi = inflater.inflate(R.layout.item, null); 
       holder = new ViewHolder(); 
       holder.text = (TextView) vi.findViewById(R.id.text); 
       holder.image = (ImageView) vi.findViewById(R.id.image); 
       holder.ck = (CheckBox) vi.findViewById(R.id.chkbox); 
       if (flag) 
        holder.ck.setChecked(true); 
       else 
        holder.ck.setChecked(false); 

       vi.setTag(holder); 
      } else 
       holder = (ViewHolder) vi.getTag(); 

      holder.text.setText(nume[position]); 
      holder.image.setTag(data[position]); 
      imageLoader.DisplayImage(data[position], activity, holder.image); 
      return vi; 
     } 

    } 
+0

什么是'flag'? – pawelzieba

+0

标志是一个布尔值。我用它为全选/ deselectall按钮:selectall.setOnClickListener(新OnClickListener(){ \t \t \t公共无效的onClick(视图v){ \t \t \t \t字符串的txt = TEXT按钮(); \t \t \t \t如果(TXT .equals( “全选”)){ \t \t \t \t \t标志=真; \t \t \t \t \t selectall.setText( “取消全”); \t \t \t \t}否则{ \t \t \t \t \t标志=假; \t \t \t \t \t selectall。setText(“全选”); \t \t \t \t} \t \t \t \t的getData(); \t \t \t} \t \t}); – Gabrielle

+0

好的,你接受了不正确的答案:) – pawelzieba

回答

2

列表中的视图被回收。您的数据列表可能有100行,但ListView只有10个(这些可见的)行。当你滚动时,行被回收。 ListView中的最后一行转到第一个位置或其他方式。你必须改变这些行的状态。 您需要保持数组中的复选框状态,而不是视图中。

添加

 final List<Boolean> isCheckedList; 

在构造函数初始化:

 isCheckedList = new ArrayList<Boolean>(); 
     for(int i=0;i<myDataLength;i++){ 
      isCheckedList.add(Boolean.FALSE); 
     } 

和修改getView:

 holder.ck.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       isCheckedList.set(position, holder.ck.isChecked()); 
      } 
     }); 

在地方,你填写行:

 holder.ck.setChecked(isCheckedList.get(position)); 

改变状态的所有复选框使用:

 Collections.fill(isCheckedList, Boolean.FALSE); 
     notifyDataSetChanged(); 
+0

我认为是好的,你写了,但我得到nullpointerexception行holder.ck.setChecked(isCheckedList.get(位置));哪里有问题? – Gabrielle

+0

您说得对,我已更正了代码。现在它的工作原理,只是测试它:) – pawelzieba

+0

非常感谢你...它的工作:) – Gabrielle

1

您需要将这些代码:

if (flag) 
     holder.ck.setChecked(true); 
    else 
     holder.ck.setChecked(false); 

出你if{}块。

+0

这只适用于部分,因为一旦我从列表顶部选择了一些东西,当我回到列表顶部时,我滚动到列表底部,不知怎的,它得到了不受检查:)谢谢;) – Gabrielle