我想过滤一个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);
}
});
Run Code Online (Sandbox Code Playgroud)
这是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");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过每一个例子并回答我在搜索中遇到的问题,但无济于事.正如你所想象的那样令人沮丧.提前感谢任何可以提供帮助的人!
paw*_*eba 16
试试这种方式:
} else {
String value = "%"+constraint.toString()+"%";
return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like ? ", new String[]{value}, null, null, null);
}
Run Code Online (Sandbox Code Playgroud)
我跳过了最后一个论点,因为我不知道它应该做什么:
"CASE WHEN LAST_NAME like '" + constraint.toString() + "%' THEN 0 ELSE 1 END, LAST_NAME"
Run Code Online (Sandbox Code Playgroud)
您是否在模拟器中的shell中尝试过此查询?
| 归档时间: |
|
| 查看次数: |
10872 次 |
| 最近记录: |