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?
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 –