【发布时间】:2011-07-10 03:21:59
【问题描述】:
我有一个由 SimpleCursorAdapter 支持的自定义项目布局的 ListView。我希望用户能够在 EditText 框中键入文本,并让 ListView 在键入时自动过滤。正如here 所述,使用 ArrayAdapter 看起来很简单。
不幸的是,我无法让它与 SimpleCursorAdapter 一起使用。我已经尝试按照here 的描述添加额外的方法,但该示例适用于 AutoCompleteTextView 而不是 ListView。我无法为我的 ListView 获得任何工作。
有人可以提供一个使用 EditText 框过滤 SimpleCursorAdapter 支持的 ListView 的示例吗?
public class DirectoryListActivity extends DirectoryActivity {
private static SimpleCursorAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.directory_list);
fillPeopleListView();
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) {
adapter.getFilter().filter(s.toString());
}
});
}
private void fillPeopleListView() {
// Populate the ListView
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
};
mCursor = queryBuilder.query(mDB, asColumnsToReturn, null, null,
null, null, directoryPeople.DEFAULT_SORT_ORDER);
startManagingCursor(mCursor);
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);
adapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
String partialValue = constraint.toString();
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
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
};
Cursor c = queryBuilder.query(mDB, asColumnsToReturn, directoryPeople.LAST_NAME + " LIKE " + partialValue, null,
null, null, directoryPeople.DEFAULT_SORT_ORDER);
return c;
}
});
}
根据要求,这是我的布局代码。主要布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/white">
<include android:id="@+id/lytHeadBar" layout="@layout/headbar" />
<include android:id="@+id/lytTitleBar" layout="@layout/titlebar" />
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Type a name..."
android:maxLines="1" android:inputType="textFilter|textCapWords" android:id="@+id/search_box"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listPeople"
android:divider="@android:drawable/divider_horizontal_dark"
android:cacheColorHint="@android:color/white" />
</LinearLayout>
列表项布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lytItem"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:background="@drawable/item_line_bottom">
<LinearLayout android:id="@+id/nameLine"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/txtLastName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:text="lastname" />
<TextView
android:id="@+id/nameSpace1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="@android:color/black"
android:text=", " />
<TextView
android:id="@+id/txtFirstName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="@android:color/black"
android:text="firstname" />
<TextView
android:id="@+id/nameSpace2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="@android:color/black"
android:text=" " />
<TextView
android:id="@+id/txtMiddle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="@android:color/black"
android:text="middle" />
</LinearLayout>
<LinearLayout android:id="@+id/titleLine"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/txtTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@android:color/black"
android:text="title" android:ellipsize="marquee"/>
</LinearLayout>
</LinearLayout>
【问题讨论】:
标签: android