2013-04-21 59 views
0

我想實現一個selectall複選框,onClick將檢查列表中的所有複選框。實現SelectAll工作不正常

在活動onCreate中,它加載此佈局。 selectall複選框將始終位於最前面。

<LinearLayout 
    android:id="@+id/linearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" > 

    <CheckBox 
     android:id="@+id/cb_selectall" 
     android:text="@string/s_ab_selectall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

    </CheckBox> 
</LinearLayout> 

    <ListView 
     android:id="@id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="5dp" 
     android:cacheColorHint="#0000" 
     android:clipToPadding="true" 
     android:dividerHeight="1dp" 
     android:scrollbars="none" 
     android:soundEffectsEnabled="true" > 
    </ListView> 

這是我嘗試使用setOnCheckedChangeListener實現selectall的適配器。

public class MyMediaAdapter extends ArrayAdapter<Media> { 

     private final List<Media> list; 
     private final Activity context; 

     public MyMediaAdapter(Activity context, List<Media> list) { 
      super(context, R.layout.media_view, list); 
      this.context = context; 
      this.list = list; 
     } 

     private class ViewHolder { 
      protected TextView fName, fSub, fDuration, fSize; 
      protected CheckBox checkbox; 
      // protected CheckBox checkbox1; 
     } 

     @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 
     // Moved here to ensure the checkbox is persistent 
     ViewHolder viewHolder = new ViewHolder(); 
     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.media_view, null); 
      // Moved out of the if-else to solve the problem 
      // view being recycled each time it scrolls 
      // final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.fName = (TextView) view.findViewById(R.id.tvfname); 
      viewHolder.fSub = (TextView) view.findViewById(R.id.tvsub); 
      viewHolder.fDuration = (TextView) view.findViewById(R.id.tvduration); 
      viewHolder.fSize = (TextView) view.findViewById(R.id.tvsize); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 

      // viewHolder.checkbox.setId(position); 
      viewHolder.checkbox.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        CheckBox cb = (CheckBox) v; 
        int id = cb.getId(); 
        if (selection[id]) { 
         cb.setChecked(false); 
         selection[id] = false; 
         list.get(id).setSelected(false); 
        } else { 
         cb.setChecked(true); 
         selection[id] = true; 
         list.get(id).setSelected(true); 
        } 
       } 
      }); 

      view.setTag(viewHolder); 
      // Moved out of the if-else to solve the problem 
      // view being recycled each time it scrolls 
      // viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      // Moved out of the if-else to solve the problem 
      // view being recycled each time it scrolls 
      // ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
      viewHolder = (ViewHolder) view.getTag(); 
     } 

     final CheckBox checkbox1 = (CheckBox) findViewById(R.id.cb_selectall); 

     checkbox1.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton button, boolean checked) { 
       // TODO Auto-generated method stub 

       if (checked) { 
        checkbox1.setText("Click to Deselect All"); 

        for (int i = 0; i < getMediaList.size(); i++) { 
         selection[i] = true; 
         list.get(i).setSelected(true); 
        } 
       } else { 
        checkbox1.setText("Click to Select All"); 

        for (int i = 0; i < getMediaList.size(); i++) { 
         selection[i] = false; 
         list.get(i).setSelected(false); 
        } 
       } 
       Toast.makeText(getApplicationContext(), "this " +checked, Toast.LENGTH_LONG).show(); 
      } 

     }); 

     // Moved here to ensure the checkbox is persistent 
     viewHolder.checkbox.setId(position); 
     viewHolder.checkbox.setTag(list.get(position)); 

     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.fName.setText(list.get(position).getName()); 
     holder.fSub.setText(list.get(position).getPath()); 
     // Converting duration from String to Long 
     long milli = Long.valueOf(list.get(position).getDuration()); 
     // Put it in % min, % sec format to display 
     holder.fDuration.setText(util.readableTime(milli)); 
     // Convert data size from String to Long 
     long datasize = Long.valueOf(list.get(position).getData()); 
     // Put in human readable format 
     holder.fSize.setText(util.readableFileSize(datasize)); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     return view; 
    } 
    } 

的事情是,當我在全選複選框打鉤,我能夠獲得名單上的項目,只需在視圖本身,當我向下滾動個體複選框只顯示。當我檢查selectall複選框時,它不會立即檢查。

更新:我已經解決了我的問題,只需調用notifyDataSetChanged();在checkchangelistener之後。

+0

我面臨同樣的問題u能幫助我/// – W00di 2013-09-07 07:51:24

回答

0

讓你的父母佈局相對佈局,然後在全選複選框添加此屬性,

android:layout_alignParentTop="true" 
+0

您好,感謝您的幫助,但我有解決了我自己的問題,因爲我更新了我的第一篇文章。 – user1778855 2013-04-21 13:42:02

+0

啊我沒有看到它,很高興看到你解決了它:) – 2013-04-21 13:42:54