【问题标题】:ListView, SimpleCursorAdapter, an an EditText filter -- why won't it do anything?ListView、SimpleCursorAdapter、一个 EditText 过滤器——为什么它什么都不做?
【发布时间】:2011-03-16 07:56:35
【问题描述】:

我想过滤一个 SimpleCursorAdapter 驱动的 ListView,其上方有一个 EditText 框。我有以下代码,但是当我在框中输入时,什么也没有发生;完整列表继续显示。我做错了什么?

    mCursor = getDirectoryList(null);

    adapter = new SimpleCursorAdapter(this,
            R.layout.directory_people_item, mCursor,
            new String[]{
                directoryPeople.LAST_NAME,
                directoryPeople.FIRST_NAME,
                directoryPeople.MIDDLE_NAME,
                directoryPeople.JOB_TITLE},
            new int[]{
                R.id.txtLastName,
                R.id.txtFirstName,
                R.id.txtMiddle,
                R.id.txtTitle} 
    ); 

    ListView av = (ListView)findViewById(R.id.listPeople);
    av.setAdapter(adapter);
    av.setFastScrollEnabled(true);
    av.setTextFilterEnabled(true);

    EditText etext=(EditText)findViewById(R.id.search_box);
    etext.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 = (ListView)findViewById(R.id.listPeople);
            SimpleCursorAdapter filterAdapter = (SimpleCursorAdapter)av.getAdapter();
            filterAdapter.getFilter().filter(s.toString());
        }
    });

    adapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            return getDirectoryList(constraint);
        }
    });

这里是getDirectoryList()

public Cursor getDirectoryList (CharSequence constraint)  {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(
        directoryPeople.PEOPLE_TABLE
    );

    String asColumnsToReturn[] = { 
            directoryPeople.PEOPLE_TABLE + "."
            + directoryPeople.LAST_NAME + "," +
            directoryPeople.PEOPLE_TABLE + "."
            + directoryPeople.FIRST_NAME + "," +
            directoryPeople.PEOPLE_TABLE + "."
            + directoryPeople.MIDDLE_NAME + "," +
            directoryPeople.PEOPLE_TABLE + "."
            + directoryPeople.JOB_TITLE + "," +
            directoryPeople.PEOPLE_TABLE + "."
            + directoryPeople._ID
    };

    if (constraint == null  ||  constraint.length () == 0)  {
        //  Return the full list
        return queryBuilder.query(mDB, asColumnsToReturn, null, null,
                null, null, directoryPeople.DEFAULT_SORT_ORDER);
    }  else  {
        return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like '%'" + 
            constraint.toString() + "'%'", null, null, null,
            "CASE WHEN LAST_NAME like '" + constraint.toString() +
            "%' THEN 0 ELSE 1 END, LAST_NAME");
    }
}

我已经尝试了我在搜索中遇到的每个示例和答案,但无济于事。正如您可以想象的那样,这令人沮丧。提前感谢任何可以提供帮助的人!

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个方法:

    }  else  {
        String value = "%"+constraint.toString()+"%";
    
        return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like ? ", new String[]{value}, null, null, null);
    }
    

    我跳过了最后一个参数,因为我不知道它到底应该做什么:

    "CASE WHEN LAST_NAME like '" + constraint.toString() + "%' THEN 0 ELSE 1 END, LAST_NAME"
    

    你在模拟器的shell中试过这个查询吗?

    【讨论】:

    • 我也不知道这个论点是做什么的。我从我找到的一个示例中复制了那一点,当时太累了,无法弄清楚那部分做了什么,所以我把它留在里面。但是如果过滤器工作并且那个查询有问题,那么 ListView 至少不应该改变无论如何?我会尝试你的建议并报告。
    • 它符合您的建议!你不知道我有多开心。这段时间我离得很近。非常感谢!
    • 这里的 mDB 是什么?使用与 SimpleCursorAdapter 相同的数据库帮助程序给我一个“fillWindow() 错误中的无效语句” 在我的列表活动中,我使用了一个 mDbHelper 实例,它是我的 DatabaseHelper。我在 listActivity 的 onCreate 中调用 c = mDbHelper.fetchAllFriends(),然后调用 startManagingCursor()。我应该为 runQuery() 中的调用声明一个新的 mDbHelper 实例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多