2011-01-06 5 views
1

친구,프로그래밍 방식으로 사용자 지정 목록 어댑터의 모든 확인란을 선택하는 방법은 무엇입니까?

다음 사용자 지정 어댑터를 사용하여 listview에서 textview 및 checboxes를 표시하고 있습니다. 지금 textview가 목록에서 선택 목록의 checbox를 클릭 할 때 selectAll 인 경우 아래 목록의 모든 확인란을 선택해야합니다. 내 경우 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 인 경우에만 새 뷰를 확장해야합니다.

둘째, 첫 번째 항목을 클릭 할 때 클릭에 대한 작업 만 수행하고 모든 항목에 대한 처리기를 만들고 설정하는 것처럼 보입니다. 당신은 당신의 엘리먼트 중 하나를 제외한 모든 것에 효과적으로 no-op 이벤트 핸들러를 붙이는 것보다 체크를 외부로 옮김으로써 코드를보다 효율적으로 만들 수 있습니다.

나는 강하게 당신이 구글 I에서의 ListView에이 비디오/O 가라고 : http://developer.android.com/videos/index.html#

0

확인란의 상태를 저장하려면 전역 부울 배열이 있어야합니다.

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

아래로

선언에서 onCreate 외부에서이 배열() 메소드

private boolean[] itemToggled; 

그리고에서 onCreate 내부를 초기화한다() 메소드는 다음 당신은 당신의 어댑터 안에이있을 수 있습니다.

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

... 즐길 BREAK_1 즐거운 유지를

관련 문제