【问题标题】:Android filter listview depending on edittext input with sql statementsAndroid根据带有sql语句的edittext输入过滤listview
【发布时间】:2012-02-09 19:05:36
【问题描述】:

我想问一个小问题。我想知道哪种方法是过滤从 sqlite 数据库中填充的列表视图的最佳方法,并且我想根据用户在编辑文本中输入的字母对其进行过滤。我没有显示任何代码,因为我只有 sqlite 语句,仅此而已。我必须更改用于填充数据库的 sqlite 语句。

所以我的问题是,当用户在编辑文本中输入字母时如何更改我的 sqlite 语句,以及如何使用新的 sql 语句过滤的新数据更新我的列表视图。

【问题讨论】:

    标签: android sqlite android-listview filtering


    【解决方案1】:

    我遇到了同样的问题,解决方法如下:

    //Search text and changed handler
            EditText tbSearch = (EditText)findViewById(R.id.android_searchbox);
            tbSearch.addTextChangedListener(new TextWatcher() {
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                public void afterTextChanged(Editable s) {
                    ListView av = getListView();
                    SimpleCursorAdapter filterAdapter = (SimpleCursorAdapter)av.getAdapter();
                    filterAdapter.getFilter().filter(s.toString());
                }
            });
    
            entries.setFilterQueryProvider(new FilterQueryProvider() {
                public Cursor runQuery(CharSequence constraint) {
                    return mDbHelper.fetchAllEntries(constraint);
                }
            });
    

    使用这种方法,您将需要一个类似于 FetchAllEntries(string sFilter) 的方法

    /*
     * Override to return a Cursor over the list of Entries filtered by a
     * constraint
     * 
     * @return Cursor over filtered Entries
     */
    public Cursor fetchAllEntries(CharSequence constraint) {
    
        if (constraint == null || constraint.length() == 0) {
            // Return the full list
            return fetchAllEntries();
        } else {
    
            String value = "%" + constraint.toString() + "%";
    
            String[] columns = new String[] { KEY_ROWID, KEY_TITLE,
                    KEY_BODY, KEY_USER_PROFICIENCY };
    
            return mDb.query(DATABASE_TABLE, columns,
                    KEY_TITLE + " like ? OR " + KEY_BODY + " like ? ", new String[] { value, value }, null, null,
                    KEY_TITLE + " ASC ");
    
        }
    }
    

    这里有一个包含两列(标题、正文)的表格

    【讨论】:

    • 任何想法如何使这个与 BaseAdapter 一起工作。因为我使用的适配器是延迟加载的实现,它扩展了 BaseAdapter。
    • hmm.. 抱歉,我对适配器类型不太了解,但基于 what I read,这就是创建 SimpleCursorAdapter 的目的。直接使用数据库..
    【解决方案2】:

    查看您之前问题的答案,它们非常相似:search bar

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2017-12-12
      • 2012-02-02
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多