我有一个自定义适配器,如下所示。
public class EntryAdapter extends ArrayAdapter<Item> {
private Context context;
private ArrayList<Item> items;
private ArrayList<Item> fitems;
private LayoutInflater vi;
private contact contact;
public EntryAdapter(Context context,ArrayList<Item> items) {
super(context,0, items);
this.context = context;
this.contact=(contact) context;
this.items = items;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return super.getCount();
}
@Override
public Item getItem(int position) {
// TODO Auto-generated method stub
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final Item i = items.get(position);
if (i != null) {
if(i.isSection()){
SectionItem si = (SectionItem)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
}else{
EntryItem ei = (EntryItem)i;
v = vi.inflate(R.layout.entrylist, null);
final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
final TextView subtitle = (TextView)v.findViewById(R.id.list_item_entry_summary);
if (title != null)
title.setText(ei.title);
if(subtitle != null)
subtitle.setText(ei.subtitle);
}
}
return v;
}
}
在我的活动中,我已将此适配器添加到列表视图中。
adapter = new EntryAdapter(contact.this,items);
lv.setAdapter(adapter);
我有EditText
并且我已经实现了以下逻辑,但我无法通过edittext过滤数据。我怎样才能做到这一点?
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
contact.this.adapter.getFilter().filter(s.toString());
}
答案 0 :(得分:0)
你应该让“EntryAdapter”实现[**Filterable**][1]
接口,并添加你自己的逻辑:
如果输入的文本不为空,则创建数据的新副本,但使用用户输入的内容进行过滤。
当过滤器完成后,您可能希望调用notifyDataSetChanged,并且对于getItem,返回已过滤的副本而不是原始的副本。对于getCount,返回已过滤副本的大小而不是原始大小。所有这些只应在文本不为空时应用。如果是,则使用原始数据正常运行。
顺便说一下,我发现你没有实现getCount和getItem,所以你可能是listView的新手。我建议观看讲座“listView的世界”。他们还解释了一些关于过滤的内容。答案 1 :(得分:0)
android开发者的回答者是正确和准确的。
但这里是快捷方式解决方案,只需覆盖toString();
类的Item
并返回您希望过滤器(标题或副标题或两者)项目类的字段。
public class Item {
public String title;
public String subtitle;
@Override
public String toString() {
// TODO Auto-generated method stub
return title;
}
}
然后在adapter.getFilter().filter(your_filter_string);
onTextChanged();
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
contact.this.adapter.getFilter().filter(s.toString());
}
});
这将使用相应的标题过滤列表..如果要使用其他字段过滤,则更改为toString();