2014-02-12 3 views
0

확인란과 텍스트 뷰로 구성된 맞춤 어댑터가 있습니다. EditText를 통해 필터링을 구현했습니다. 작동합니다. 그러나 내가 필터를 걸면 위치가 바뀐다. 예를 들어 나는 10 개의 체크 박스를 가지고있다. 9 번째 체크 박스에 필터를 걸고 체크 박스를 체크하면 그 위치는 0이되고, EditText를 클리어하면 9 번째 체크 박스가 아닌 첫 번째 체크 박스가 선택됩니다. 어떻게 이것을 유지할 수 있습니까? 내 사용자 정의 어댑터 클래스 :필터링 후 확인란 위치가 변경됨

public class CustomAdapter extends ArrayAdapter<Custom> implements Filterable 
{ 
    private ArrayList<Custom> entries; 
    private Activity activity; 
    private Context context; 
    private qrusers qrusers; 
    Custom data; 
    CustomFilter customFilter; 
    private String[] udis; 
    ArrayList<String> userid= new ArrayList<String>(); 
    boolean[] checkBoxState; 
    private ArrayList<Custom> orignalvalues; 
    LayoutInflater vi; 
    public CustomAdapter(Context context, ArrayList<Custom> entries,String []udis,ArrayList<Custom> orignalvalue) { 
     super(context,0,entries); 
     this.entries = entries; 
     this.context= context; 
     orignalvalues = new ArrayList<Custom>(entries); 
     this.udis=udis; 
     checkBoxState=new boolean[entries.size()]; 
     this.qrusers =(qrusers) context; 
     vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public static class ViewHolder{ 
     public TextView item1; 
     public TextView item2; 
     public CheckBox chek; 
    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 

     return entries.size(); 
    } 

    @Override 
    public Custom getItem(int position) { 
     // TODO Auto-generated method stub 
     return super.getItem(position); 
     } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ViewHolder holder; 
     final Custom i = entries.get(position); 
     final Custom t = orignalvalues.get(position); 
     if (v == null) { 

      v = vi.inflate(R.layout.checkboxlist, null); 
      holder = new ViewHolder(); 
      holder.item1 = (TextView) v.findViewById(R.id.contactname); 
      holder.item2 = (TextView) v.findViewById(R.id.companyname); 
      holder.chek=(CheckBox)v.findViewById(R.id.checboxlist); 
      data = getItem(position); 

      holder.chek.setOnCheckedChangeListener(null); //important 
      holder.chek.setChecked(data.isChecked()); 


      v.setTag(holder); 


     } 

     else{ 
      holder=(ViewHolder)v.getTag(); 


     } 
     holder.chek.setChecked(checkBoxState[position]); 
     holder.chek.setTag(udis[position]); 
     holder.chek.setOnClickListener(new OnClickListener() { 
      private String s; 
      @Override 
      public void onClick(View v) { 
       if (((CheckBox) v).isChecked()){ 
        checkBoxState[position]=true; 
        data.setChecked(true); 
        // isChecked=true; 
        s=(String)v.getTag(); 
        Log.e("IDDDDDDDD", s); 

        userid.add(s); 
      Log.e("ADDED ID", userid.toString()); 
      } 
       else{ 
        checkBoxState[position]=false; 
        s=(String)v.getTag(); 
        userid.remove(s); 
        Log.e("Removed ID", userid.toString()); 
       } 
       SharedPreferences app_preferences = PreferenceManager 
         .getDefaultSharedPreferences(context); 
       SharedPreferences.Editor editor = app_preferences.edit(); 

       editor.putString("userid", TextUtils.join(",", userid)); 
       editor.commit(); 
       } 

     } 
     ); 
     Custom ei = (Custom)i; 
     if (ei != null) { 
      holder.item1.setText(ei.getcustomBig()); 
      holder.item2.setText(ei.getcustomSmall()); 

     } 
     return v; 
     } 
    public Filter getFilter() { 
     if (customFilter == null) { 
      customFilter = new CustomFilter(); 
     } 
     return customFilter; 
    } 


    public ArrayList<String> getUserid() { 
     return userid; 
    } 
    public void setUserid(ArrayList<String> userid) { 
     this.userid = userid; 
    } 
    private class CustomFilter extends Filter{ 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      if(constraint == null || constraint.length() == 0) { 
       entries = new ArrayList<Custom>(orignalvalues); 
       results.values=entries; 
       results.count = entries.size(); 

      } 
      else{ 

       ArrayList<Custom> newValues = new ArrayList<Custom>(); 

       for (Custom i : entries){ 

        if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase())) 
          newValues.add(i); 
       } 
       results.count = newValues.size(); 
       results.values = newValues; 
       Log.e("NEW VALUES", newValues.toString()); 
      } 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      if (results.count == 0){ 
        notifyDataSetInvalidated(); 

       } else { 
        Log.e("publish result", results.toString()); 
        @SuppressWarnings("unchecked") 
        ArrayList<Custom> listi = (ArrayList<Custom>)results.values; 
        ArrayList<Custom> itemsList = new ArrayList<Custom>(listi); 
        entries =itemsList;    
        notifyDataSetChanged();    


       } 
     } 


    } 
} 

답변

0

특히 뷰가 변경 될 때 checkBoxState를 독립 배열로 사용하지 마십시오. 홀더에 checkBoxState를 유지하십시오.

+0

이렇게하면 자동으로 체크 박스가 선택됩니다. – user2699728

+0

Holder 클래스에'public boolean isChecked'를 넣습니다. 'holder.chek.setChecked (holder.isChecked)'를 사용하십시오. 그런 다음 확인란이 기본적으로 선택되지 않아야합니다. – novic3

관련 문제