如何从Edittext android过滤listview?

时间:2013-12-31 06:19:23

标签: android android-listview android-arrayadapter

我有一个自定义适配器,如下所示。

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());

                    }

2 个答案:

答案 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();