我实际上是想用文本过滤我的ListView。
如果我输入内容,结果会被过滤掉,但如果我再次删除输入的文本,则列表为空。 :(
你知道我怎么解决这个问题吗?
到目前为止,这是代码:
public class ResultsArrayAdapter extends ArrayAdapter<SuchErgebnis> {
Context myContext;
int layoutResourceId;
ArrayList<SuchErgebnis> ergebnisListeOriginal = null;
ArrayList<SuchErgebnis> ergebnisListeGefiltert = null;
private Filter filter;
public ResultsArrayAdapter(Context context, int textViewResourceId,
ArrayList<SuchErgebnis> objects) {
super(context, textViewResourceId, objects);
this.myContext = context;
this.layoutResourceId = textViewResourceId;
this.ergebnisListeOriginal = objects;
this.ergebnisListeGefiltert = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ErgebnisHolder eHolder = null;
SuchErgebnis ergebnis = ergebnisListeGefiltert.get(position);
if (row == null) // Wird zum ersten Mal gelanden...
{
LayoutInflater inflater = (LayoutInflater) myContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.ergebnis_list_item, parent, false);
eHolder = new ErgebnisHolder();
eHolder.eTitel = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_titel);
eHolder.eInfo = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_info);
eHolder.eTreffer = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_treffer);
row.setTag(eHolder);
} else { // Wurde schoneinmal geladen, Views sind noch gespeichert...
eHolder = (ErgebnisHolder) row.getTag();
}
eHolder.eTitel.setText(ergebnis.titel);
eHolder.eInfo.setText(ergebnis.info != null ? ergebnis.info : "");
eHolder.eTreffer.setText(ergebnis.treffer != null ? ergebnis.treffer
: "");
row.setPadding(
ergebnis.isChild ? Main.mFHelper
.getPixels(10 * ergebnis.childNumber) : 0, 0, 0, 0);
return row;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new ResultFilter();
}
return filter;
}
static class ErgebnisHolder {
TextView eTitel;
TextView eInfo;
TextView eTreffer;
}
private class ResultFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
String filterText = constraint.toString().toLowerCase();
if (filterText == null || filterText.length() == 0) {
synchronized (this) {
results.values = ergebnisListeOriginal;
results.count = ergebnisListeOriginal.size();
}
} else {
ArrayList<SuchErgebnis> gefilterteListe = new ArrayList<SuchErgebnis>();
ArrayList<SuchErgebnis> ungefilterteListe = new ArrayList<SuchErgebnis>();
synchronized (this) {
ungefilterteListe.addAll(ergebnisListeOriginal);
}
for (int i = 0, l = ungefilterteListe.size(); i < l; i++) {
SuchErgebnis m = ungefilterteListe.get(i);
if (m.titel.toLowerCase().contains(filterText)) {
gefilterteListe.add(m);
}
}
results.values = gefilterteListe;
results.count = gefilterteListe.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
ergebnisListeGefiltert = (ArrayList<SuchErgebnis>) results.values;
// notifyDataSetChanged();
clear();
for (int i = 0, l = ergebnisListeGefiltert.size(); i < l; i++)
add(ergebnisListeGefiltert.get(i));
// notifyDataSetInvalidated();
}
}
}
编辑://
过滤器由简单的Textwatcher
调用private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
mAdapter.getFilter().filter(s);
}
};
我通过
添加到EditTextetFilter.addTextChangedListener(filterTextWatcher);
答案 0 :(得分:7)
我的解决方案:
public class ResultsArrayAdapter extends ArrayAdapter<SuchErgebnis> {
Context myContext;
int layoutResourceId;
ArrayList<SuchErgebnis> ergebnisListeOriginal = null;
ArrayList<SuchErgebnis> ergebnisListeGefiltert = null;
private Filter filter;
public ResultsArrayAdapter(Context context, int textViewResourceId,
ArrayList<SuchErgebnis> objects) {
super(context, textViewResourceId, objects);
this.myContext = context;
this.layoutResourceId = textViewResourceId;
this.ergebnisListeOriginal = new ArrayList<SuchErgebnis>(objects);
this.ergebnisListeGefiltert = new ArrayList<SuchErgebnis>(objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ErgebnisHolder eHolder = null;
SuchErgebnis ergebnis = ergebnisListeGefiltert.get(position);
if (row == null) // Wird zum ersten Mal gelanden...
{
LayoutInflater inflater = (LayoutInflater) myContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.ergebnis_list_item, parent, false);
eHolder = new ErgebnisHolder();
eHolder.eTitel = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_titel);
eHolder.eInfo = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_info);
eHolder.eTreffer = (TextView) row
.findViewById(R.id.ergebnis_list_item_textview_treffer);
row.setTag(eHolder);
} else { // Wurde schoneinmal geladen, Views sind noch gespeichert...
eHolder = (ErgebnisHolder) row.getTag();
}
eHolder.eTitel.setText(ergebnis.titel);
eHolder.eInfo.setText(ergebnis.info != null ? ergebnis.info : "");
eHolder.eTreffer.setText(ergebnis.treffer != null ? ergebnis.treffer
: "");
row.setPadding(
ergebnis.isChild ? Main.mFHelper
.getPixels(10 * ergebnis.childNumber) : 0, 0, 0, 0);
return row;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new ResultFilter();
}
return filter;
}
static class ErgebnisHolder {
TextView eTitel;
TextView eInfo;
TextView eTreffer;
}
@Override
public int getCount() {
return ergebnisListeGefiltert.size();
}
@Override
public SuchErgebnis getItem(int position) {
return ergebnisListeGefiltert.get(position);
}
private class ResultFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
String filterText = constraint.toString().toLowerCase();
if (filterText == null || filterText.length() == 0) {
synchronized (this) {
results.values = ergebnisListeOriginal;
results.count = ergebnisListeOriginal.size();
}
} else {
ArrayList<SuchErgebnis> gefilterteListe = new ArrayList<SuchErgebnis>();
ArrayList<SuchErgebnis> ungefilterteListe = new ArrayList<SuchErgebnis>();
synchronized (this) {
ungefilterteListe.addAll(ergebnisListeOriginal);
}
for (int i = 0, l = ungefilterteListe.size(); i < l; i++) {
SuchErgebnis m = ungefilterteListe.get(i);
if (m.titel.toLowerCase().contains(filterText)) {
gefilterteListe.add(m);
}
}
results.values = gefilterteListe;
results.count = gefilterteListe.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
ergebnisListeGefiltert = (ArrayList<SuchErgebnis>) results.values;
if(results.count > 0)
{
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
}
}