gpt4 book ai didi

android - 使用 EditText 过滤支持 SimpleCursorAdapter 的 ListView

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:36:01 24 4
gpt4 key购买 nike

我有一个 ListView,它带有由 SimpleCursorAdapter 支持的自定义项目布局。我希望用户能够在 EditText 框中键入文本,并让 ListView 在他们键入时自动进行过滤。看起来使用 ArrayAdapter 非常简单,如所述 here .

不幸的是,我没有运气让它与 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>

最佳答案

嗯,它更像是 arrayAdapter这是示例代码

public class ListViewFilter extends Activity {
private ItemDatabaseHelper itemData;
private SimpleCursorAdapter sc;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
itemData=new ItemDatabaseHelper(this);
Cursor c=itemData.getAllValues();

sc=new
SimpleCursorAdapter(this, R.layout.list_items, c, new String[]{itemData.VALUE}, new int[]{R.id.txtItem});
ListView lv=(ListView)findViewById(R.id.lstItems);
lv.setAdapter(sc);
sc.setFilterQueryProvider(new FilterQueryProvider() {

@Override
public Cursor runQuery(CharSequence constraint) {
String partialValue = constraint.toString();
return itemData.getAllSuggestedValues(partialValue);

}
});
EditText etext=(EditText)findViewById(R.id.etxtItemName);
etext.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {


}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {


}

@Override
public void afterTextChanged(Editable s) {
sc.getFilter().filter(s.toString());

}
});
}

下面列出了两个xml文件

main.xml是

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/etxtItemName"
android:layout_alignParentTop="true"
/>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/lstItems"
android:layout_below="@+id/etxtItemName"
/>
</RelativeLayout>

list_item.xml 是

  <?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/txtItem"
android:layout_width="match_parent"
android:layout_height="match_parent">
</TextView>

希望对你有帮助

关于android - 使用 EditText 过滤支持 SimpleCursorAdapter 的 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5216414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com