Android列表视图过滤器无需按搜索按钮问题

时间:2015-06-14 02:34:48

标签: android database listview filter

我有一个ListView工作正常。现在我将EditText放在ListView的顶部。我想要的是当输入字母“A”时,只有以“A”开头的名字应出现在列表中。我试着这样做但没有任何反应请检查我的代码并告诉我我做错了什么。

这是我的数据清单代码。

public abstract class ListDataAdapter extends ArrayAdapter {

List list = new ArrayList();
boolean index[];

public ListDataAdapter(Context context, int resource) {

    super(context, resource);
    index = new boolean[list.size()];

}




static class LayoutHandler {
    TextView name, quantity, calorie, fat, protein, sugar, vitamins;
    CheckBox names;

}

@Override
public void add(Object object) {

    super.add(object);
    list.add(object);
    index = new boolean[list.size()];

}

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

}

@Override
public Object getItem(int position) {
    return list.get(position);

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View row = convertView;
    LayoutHandler layoutHandler;
    if (row == null) {
        LayoutInflater layoutInflater = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = layoutInflater.inflate(R.layout.row_layout, parent, false);
        layoutHandler = new LayoutHandler();
        layoutHandler.name = (TextView) row
                .findViewById(R.id.text_dish_name);
        layoutHandler.quantity = (TextView) row
                .findViewById(R.id.text_dish_quantity);
        layoutHandler.calorie = (TextView) row
                .findViewById(R.id.text_dish_calorie);
        layoutHandler.fat = (TextView) row.findViewById(R.id.text_dish_fat);
        layoutHandler.protein = (TextView) row
                .findViewById(R.id.text_dish_protein);
        layoutHandler.sugar = (TextView) row
                .findViewById(R.id.text_dish_sugar);
        layoutHandler.vitamins = (TextView) row
                .findViewById(R.id.text_dish_vitamins);
        layoutHandler.names = (CheckBox) row.findViewById(R.id.checkBox1);

        row.setTag(layoutHandler);

    } else {
        layoutHandler = (LayoutHandler) row.getTag();

    }
    DataProvider dataProvider = (DataProvider) this.getItem(position);
    layoutHandler.name.setText(dataProvider.getName());
    layoutHandler.quantity.setText(dataProvider.getQuantity());
    layoutHandler.calorie
            .setText(String.valueOf(dataProvider.getCalorie()));
    layoutHandler.fat.setText(dataProvider.getFat());
    layoutHandler.protein.setText(dataProvider.getProtein());
    layoutHandler.sugar.setText(dataProvider.getSugar());
    layoutHandler.vitamins.setText(dataProvider.getVitamins());

    //layoutHandler.names.setChecked(dataProvider.isSelected());
    layoutHandler.names.setTag(position);
    layoutHandler.names.setChecked(index[position]);
    layoutHandler.names
            .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                                             boolean isChecked) {
                    // TODO Auto-generated method stub
                    int pos = (Integer) buttonView.getTag();
                    index[pos] = isChecked;
                    showCheckedButton(position, isChecked);

                }
            });


    return row;
}

public ArrayList<DataProvider> getSelectedIndexes() {
    int size = list.size();
    ArrayList<DataProvider> selectedItems = new ArrayList<DataProvider>();
    for (int i = 0; i < size; i++) {
        DataProvider cItem = (DataProvider) list.get(i);
        if (index[i]) {
            selectedItems.add(cItem);
        }
    }

    return selectedItems;

}

protected abstract void showCheckedButton(int position, boolean value);

这是我的自定义适配器代码

{{1}}

}

1 个答案:

答案 0 :(得分:3)

使用EditText的addTextChangedListener()方法。它看起来像这样

    inputSearch = (EditText)findViewById(R.id.editText);
....
....
listView.setAdapter(listDataAdapter);
inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changes the Text
            listDataAdapter.getFilter().filter(cs);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub
        }
    });