2016-08-01 8 views
0

verbrachte Stunden versuchen, dies zu arbeiten, aber ohne Erfolg :( Ich habe ein Suchfilter für meine Listview eingerichtet, die funktioniert gut. Aber jeder hat eine Checkbox - wenn ich überprüfe . das Kontrollkästchen entweder vor oder nach der Filterung, es ist nicht wird daran erinnert, welche die Filter sinnlos macht Würde einige Hinweise hier schätzenErinnern, welche Checkbox wurde mit einem Suchfilter überprüft

Mein Code:.

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.SearchView; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.Arrays; 

public class MainActivity extends AppCompatActivity implements 
     SearchView.OnQueryTextListener { 

    private AllStuffModel[] modelItems = AllStuff.allConditions; 
    private ListView conditionsView; 
    private SearchView search_view; 
    private AllStuffAdapter adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     adapter = new AllStuffAdapter(this, new ArrayList<AllStuffModel>(Arrays.asList(modelItems)), this); 
     conditionsView = (ListView) findViewById(R.id.condition_list); 
     conditionsView.setAdapter(adapter); 

     search_view = (SearchView) findViewById(R.id.search_view); 
     search_view.setOnQueryTextListener(this); 

    } 

    @Override 
    public boolean onQueryTextChange(String newText) { 
     adapter.getFilter().filter(newText); 
     return false; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

} 

AllStuffAdapter.java

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

public class AllStuffAdapter extends ArrayAdapter<AllStuffModel> implements Filterable { 
    private List<AllStuffModel> modelItems; 
    private List<AllStuffModel> filteredModelItems; 
    private Context context; 
    private MainActivity mainActivity; 
    private ValueFilter valueFilter; 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    public AllStuffAdapter(Context context, List<AllStuffModel> resource, MainActivity mainActivity) { 
     super(context, R.layout.condition_row, resource); 
     this.context = context; 
     this.modelItems = resource; 
     this.mainActivity = mainActivity; 
     filteredModelItems = modelItems; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.condition_row, parent, false); 
     TextView conditionText = (TextView) convertView.findViewById(R.id.condition_text); 
     final CheckBox conditionCheckBox = (CheckBox) convertView.findViewById(R.id.condition_checkbox); 
     conditionCheckBox.setId(position); 
     conditionText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!conditionCheckBox.isChecked()) { 
        conditionCheckBox.setChecked(true); 
        modelItems.get(position).setIsChecked(true); 
       } 
       else if(conditionCheckBox.isChecked()) { 
        conditionCheckBox.setChecked(false); 
        modelItems.get(position).setIsChecked(false); 
       } 
       System.out.println(modelItems.get(position).isChecked()); 
      } 
     }); 


     conditionText.setText(modelItems.get(position).getName()); 
     conditionCheckBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       CheckBox currentCheckBox = (CheckBox) v; 
       if (currentCheckBox.isChecked()) { // If checked set to true, else false 
        modelItems.get(position).setIsChecked(true); 
       } else if (!currentCheckBox.isChecked()) { 
        modelItems.get(position).setIsChecked(false); 
       } 
       System.out.println(modelItems.get(position).isChecked()); 
      } 
     }); 

     return convertView; 
    } 

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

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

    @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<AllStuffModel> filterList = new ArrayList<AllStuffModel>(); 
       for (int i = 0; i < filteredModelItems.size(); i++) { 
        if ((filteredModelItems.get(i).getName().toUpperCase()) 
          .contains(constraint.toString().toUpperCase())) { 

         AllStuffModel allConditionsModel = new AllStuffModel(filteredModelItems.get(i).getCode(),filteredModelItems.get(i).getName()); 

         allConditionsModel.setIsChecked(filteredModelItems.get(i).isChecked()); 

         filterList.add(allConditionsModel); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = filteredModelItems.size(); 
       results.values = filteredModelItems; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      modelItems = (ArrayList<AllStuffModel>) results.values; 
      notifyDataSetChanged(); 
     } 
    } 

} 

AllStuffModel.java

public class AllStuffModel { 
     private String name; 
     private String code; 
     private boolean isChecked; 


     public AllStuffModel(String code, String name) { 
      this.name = name; 
      this.code = code; 
     } 


     public String getName() { 
      return this.name; 
     } 


     public String getCode() { 
      return this.code; 
     } 


     public boolean isChecked() { 
      return isChecked; 
     } 


     public void setIsChecked(boolean isChecked) { 
      this.isChecked = isChecked; 
     } 
    } 

AllStuff.java 

    public class AllStuff { 

     private AllStuff() { 

     } 

     public static final AllStuffModel[] allConditions = { 
       new AllStuffModel("ca", "Candy"), 
       new AllStuffModel("fo", "Football"), 
       new AllStuffModel("mu", "Music"), 
       new AllStuffModel("sn", "Snooker"), 
     }; 

    } 

condition_row.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal" 
     android:paddingTop="10dp"> 

     <CheckBox 
      android:id="@+id/condition_checkbox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="7dp" /> 

     <TextView 
      android:id="@+id/condition_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView" 
      android:textColor="#DE000000" 
      android:textSize="17sp" /> 

    </LinearLayout> 

activity_main.xml 

    <?xml version="1.0" encoding="utf-8"?> 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/scrollview_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 


     <SearchView 
      android:id="@+id/search_view" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:padding="2dp" 
      android:queryHint="Search...." /> 




     <ListView 
      android:id="@+id/condition_list" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"></ListView> 


    </LinearLayout> 

    </ScrollView> 

Was ich habe versucht, ist notifyDataSetChaanged() in meiner onClick Methoden in AllStuffAdapter zu verwenden, aber dies hält das Kontrollkästchen aus vollständig überprüft wird.

TL/DR: Wie kann ich mich an Checkboxen erinnern, die mit dem Suchfilter überprüft wurden?

+0

Ich denke, es könnte etwas mit 'hasStableIds' und Ihrer Implementierung von' getItemId' zu tun haben - Sie benötigen eine eindeutige ID und 'getItem (position)' ist keine uniqueId zwischen gefilterten Datensätzen dh Position '0' zwischen gefiltert Listen können 2 völlig verschiedene Elemente sein, aber die 'ID' ist die gleiche. http://Stackoverflow.com/a/26206584/4252352 & http://Stackoverflow.com/a/18217552/4252352 –

Antwort

1

Versuchen

conditionCheckBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      CheckBox currentCheckBox = (CheckBox) v; 
      if (currentCheckBox.isChecked()) { // If checked set to true, else false 
       modelItems.get(position).setIsChecked(true); 
      } else if (!currentCheckBox.isChecked()) { 
       modelItems.get(position).setIsChecked(false); 
      } 
      System.out.println(modelItems.get(position).isChecked()); 
     } 
    }); 

zu

conditionCheckBox.setOnCheckedChangeListener(null); 
conditionCheckBox.setChecked(modelItems.get(position).isChecked()); 
conditionCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      modelItems.get(position).setIsChecked(isChecked); 
     } 
    }); 
+0

Vielen Dank dafür - das ursprüngliche Problem scheint gelöst zu sein. Das Problem, das ich jetzt habe, ist, dass, wenn ich etwas überprüfe (wenn ich nach etwas gesucht habe, z. B. Filterung), dann zurück zur normalen Ansicht, diese Prüfung wird nicht gespeichert. – ak1652

+0

Wenn ich (in der gefilterten Ansicht) etwas deaktiviere, das normal überprüft wurde, wird diese Änderung nicht berücksichtigt. Ich habe versucht, 'notifyDataSetChanged();' zu verwenden, bevor ich meine Ergebnisse zurückgab, aber dies führte zum Absturz meiner App. Ich vermute, das liegt daran, dass ich in der ValueFilter-Klasse bin und nicht in AllStuffAdapter. TL/DR: Wenn ich die gefilterte Ansicht ändere, wird sie nicht in der normalen Ansicht angezeigt. – ak1652

+0

In 'getView' benutzt du' modelItems' für den Filter, den du 'filteredModelItems' verwendest, und nur der Konstruktor des Adapters hat eine Zuweisung für diese. Wenn Sie das Kontrollkästchen 'modelItems' anklicken, ändert sich' filteredModelItems' nicht. Ich denke, das kann eine Problemquelle sein. – faranjit

1

Dank Ändern @faranjit, ich glaube, das Hinzufügen dieser (mit Änderungen) vollständig die Probleme nach modelItems.get(position).setIsChecked(isChecked); löst. Könnte dies bitte verifiziert werden?

for(AllStuffModel item: filteredModelItems){ 
        if(modelItems.get(position).getCode().equals(item.getCode())){ 
         item.setIsChecked(isChecked); 
        } 
       } 

Wir aktualisieren nur die Liste, indem wir das richtige Element finden. Hinweis: Die code ist etwas, was ich selbst eingestellt habe und ich kann immer garantieren, dass es einzigartig sein wird.

Verwandte Themen