2016-05-13 6 views
0

Ich bin mit diesem Problem konfrontiert, das ist, wenn ich ein Element überprüft und ich suche den Namen danach, das Kontrollkästchen wird deaktiviert.Benutzerdefinierte Adapter Kontrollkästchen nicht bei der Suche aktiviert

Ich habe auf Heather

listview

es deaktiviert ist, nachdem ich

flitered listview

Wie kann ich, dass die Gegenstände überprüft werden, noch gewährleisten zu suchen, nachdem ich suchen?

CustomAdapter.java

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.ImageView; 
import android.widget.TextView; 
import java.util.ArrayList; 

public class CustomAdapter extends ArrayAdapter<Contact> implements Filterable { 

    private final Activity context; 
    private ArrayList<Contact> contacts; 
    ArrayList<Contact> stringFilterList; 
    ValueFilter valueFilter; 

    private static class ViewHolder { 
     TextView name; 
     TextView phoneno; 
     CheckBox checkBox; 
     ImageView photo; 

    } 

    public CustomAdapter(Activity context, ArrayList<Contact> contacts) { 
     super(context, R.layout.custom, contacts); 
     //super(context, R.layout.custom, contacts); 
     this.context = context; 
     this.contacts = contacts; 
     this.stringFilterList = contacts; 
    } 

    @Override 
    public int getCount() { 
     return contacts.size(); 
    } 

    /*@Override 
    public String getItem(int position) { 

     return contacts.get(position).getName(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return contacts.indexOf(getItem(position)); 
    }*/ 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewHolder viewHolder; 
     if (convertView == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      convertView = inflater.inflate(R.layout.custom, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.name = (TextView) convertView.findViewById(R.id.name); 
      viewHolder.phoneno = (TextView) convertView.findViewById(R.id.phoneno); 
      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); 
      viewHolder.photo = (ImageView) convertView.findViewById(R.id.photo); 

      viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
        contacts.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 


        //stringFilterList.get(getPosition).setSelected(buttonView.isChecked()); 
       } 
      }); 

      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.name, viewHolder.name); 
      convertView.setTag(R.id.phoneno, viewHolder.phoneno); 
      convertView.setTag(R.id.photo, viewHolder.photo); 
      convertView.setTag(R.id.checkBox, viewHolder.checkBox); 

     } 
      viewHolder = (ViewHolder) convertView.getTag(); 


     viewHolder.checkBox.setTag(position); // This line is important. 

     viewHolder.name.setText(contacts.get(position).getName()); 
     viewHolder.phoneno.setText(contacts.get(position).getPhoneNo()); 
     viewHolder.photo.setImageResource(R.drawable.photo); 
     viewHolder.checkBox.setChecked(contacts.get(position).isSelected()); 
     return convertView; 
    } 

    @Override 
    public Filter getFilter() { 
     if (valueFilter == null) { 
      valueFilter = new ValueFilter(); 
     } 
     return valueFilter; 
    } 

    private class ValueFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       ArrayList<Contact> filterList = new ArrayList<Contact>(); 
       for (int i = 0; i < stringFilterList.size(); i++) { 
        if ((stringFilterList.get(i).getName().toUpperCase()).contains(constraint.toString().toUpperCase())) { 
         Contact contact = new Contact(stringFilterList.get(i).getName(), stringFilterList.get(i).getPhoneNo()); 
         filterList.add(contact); 


        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = stringFilterList.size(); 
       results.values = stringFilterList; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      contacts = (ArrayList<Contact>) results.values; 
      notifyDataSetChanged(); 
     } 
    } 
} 
+0

Sie liefern neue Kontaktliste während notifyDataSetChanged, so ist es nicht überprüfen. Kontakt contact = new Kontakt (stringFilterList.get (i) .getName(), stringFilterList.get (i) .getPhoneNo()); Hier liefern Sie Name und Telefonnummer, isAusgewählt hat den Standardwert false –

+2

in 'performFiltering' anstelle der Initialisierung neuer' Contact' übergeben Sie Ihren Kontakt mit Position wie: 'filterList.add (contacts.get (i))' –

Antwort

1

Aktualisieren Sie Ihre ValueFilter wie unten

private class ValueFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 

      if (constraint != null && constraint.length() > 0) { 
       ArrayList<Contact> filterList = new ArrayList<Contact>(); 
       for (int i = 0; i < stringFilterList.size(); i++) { 
        if ((stringFilterList.get(i).getName().toUpperCase()).contains(constraint.toString().toUpperCase())) { 
         Contact contact = new Contact(stringFilterList.get(i).getName(), stringFilterList.get(i).getPhoneNo(),**stringFilterList.get(i).isSelected**); 
         filterList.add(contact); 


        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = stringFilterList.size(); 
       results.values = stringFilterList; 
      } 
      return results; 

     } 

isSelected Wert Ihrer neuen Kontaktliste hinzuzufügen.

+0

danke für Sie helfen, aber ich denke filterList.add (stringFilterList.get (i)); werde es tun. – user2211678

+0

Ja das funktioniert auch .. –

0

Nach Suche, wird die aktuelle Ansicht gleich Position 0 die

contacts.get(position).isSelected() 

Rückkehr wahr oder falsch Mal sehen sein.