【问题标题】:Android listview filter without pressing search button issueAndroid listview过滤器没有按搜索按钮问题
【发布时间】:2015-08-29 18:51:35
【问题描述】:

我有一个工作正常的 ListView。现在我在 ListView 的顶部放置了一个 EditText。我想要的是,当 a 输入字母“A”时,只有以“A”开头的名称才会出现在 list 中。我已尝试这样做,但没有任何反应,请检查我的代码并告诉我哪里做错了。

这是我的数据列表代码。

public class DataListActivity extends Activity  {

ListView listView;
SQLiteDatabase sqLiteDatabase;
FoodDbHelper foodDbHelper;
Cursor cursor;
ListDataAdapter listDataAdapter;
private Button button1;
ListDataAdapter dataAdapter = null;
Button button;
DataProvider dataProvider;
ArrayList<HashMap<String, String>> namessList;
EditText inputSearch;
String search_name;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.data_list_layout);




    inputSearch = (EditText)findViewById(R.id.inputSearch);


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


    listView = (ListView) findViewById(R.id.list_View);

    listDataAdapter = new ListDataAdapter(getApplicationContext(),
            R.layout.row_layout) {




        @Override
        protected void showCheckedButton(int position, boolean value) {
            // TODO Auto-generated method stub

            DataProvider item = (DataProvider) listDataAdapter
                    .getItem(position);
            Log.i("", "");

            item.setSelected(value);

            Button myButton = (Button) findViewById(R.id.findSelected);
            myButton.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                    StringBuffer responseText = new StringBuffer();
                    responseText
                           .append("The following dishes were selected...\n");

                    ArrayList<DataProvider> list = listDataAdapter
                            .getSelectedIndexes();

                    int sum = 0;
                    for (int i = 0; i < list.size(); i++) {
                        DataProvider dataProvider = list.get(i);

                        sum = sum + dataProvider.getCalorie();

                        responseText.append("\n" + dataProvider.getName()
                                + " : " + dataProvider.getCalorie()
                                + " kcal"
                                );

                    }

                    Toast.makeText(getApplicationContext(), ""+responseText+"\n"+"................................."
                                   +"\n"+"Total Calories In Your Menu Is : " +sum,
                            Toast.LENGTH_LONG).show();

                }
            });





        }





    };
    listView.setAdapter(listDataAdapter);
    foodDbHelper = new FoodDbHelper(getApplicationContext());
    sqLiteDatabase = foodDbHelper.getReadableDatabase();
    cursor = foodDbHelper.getInformations(sqLiteDatabase);
    if (cursor.moveToFirst()) {
        do {
            String name, quantity, fat, protein, sugar, vitamins;
            boolean selected = false;
            String names = null;
            Integer calorie;

            name = cursor.getString(0);
            quantity = cursor.getString(1);
            calorie = Integer.valueOf(cursor.getString(2));
            fat = cursor.getString(3);
            protein = cursor.getString(4);
            sugar = cursor.getString(5);
            vitamins = cursor.getString(6);

            DataProvider dataProvider = new DataProvider(name, quantity,
                    calorie, fat, protein, sugar, vitamins, names, selected);

            listDataAdapter.add(dataProvider);

        } while (cursor.moveToNext());


    }

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

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

}

【问题讨论】:

    标签: android database listview filter


    【解决方案1】:

    使用 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
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2020-12-13
      • 2012-02-02
      • 2012-02-12
      • 2014-01-23
      • 2018-09-24
      • 1970-01-01
      相关资源
      最近更新 更多