用一个EditText来筛选SimpleCursorAdapter支持的ListViewEditText、SimpleCursorAdapter、ListView

2023-09-12 08:00:04 作者:东京先生i

我有一个自定义项目布局由SimpleCursorAdapter支持一个ListView。我希望用户能够输入文本一个EditText框,并有他们键入的ListView自动过滤。看起来这是很简单的做一个ArrayAdapter,如here.

不幸的是,我没有任何运气得到它与SimpleCursorAdapter工作。我试图增加额外的方法描述此处,但这个例子是一个AutoCompleteTextView,而不是一个ListView。我一直无法工作为我的ListView得到任何东西。

有人可以为我提供一个过滤SimpleCursorAdapter支持的ListView有一个EditText框的例子吗?

 公共类DirectoryListActivity扩展DirectoryActivity {

    私有静态SimpleCursorAdapter适配器;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);

        的setContentView(R.layout.directory_list);

        fillPeopleListView();

        EditText上ETEXT =(EditText上)findViewById(R.id.search_box);
        etext.addTextChangedListener(新TextWatcher(){

            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){


            }

            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
                    之后INT){


            }

            公共无效afterTextChanged(编辑S){
                。adapter.getFilter()滤波器(s.toString());

            }
        });

    }

    私人无效fillPeopleListView(){
        //填充ListView
        SQLiteQueryBuilder QueryBuilder的=新SQLiteQueryBuilder();
        queryBuilder.setTables(
            directoryPeople.PEOPLE_TABLE
        );

        串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);

        适配器=新SimpleCursorAdapter(这一点,
                R.layout.directory_people_item,mCursor,
                新的String [] {
                    directoryPeople.LAST_NAME,
                    directoryPeople.FIRST_NAME,
                    directoryPeople.MIDDLE_NAME,
                    directoryPeople.JOB_TITLE},
                新的INT [] {
                    R.id.txtLastName,
                    R.id.txtFirstName,
                    R.id.txtMiddle,
                    R.id.txtTitle}
        );

        ListView的AV =(ListView控件)findViewById(R.id.listPeople);
        av.setAdapter(适配器);
        av.setFastScrollEnabled(真正的);

        adapter.setFilterQueryProvider(新FilterQueryProvider(){

            公共光标runQuery(CharSequence的约束){
                串partialValue = constraint.toString();

                SQLiteQueryBuilder QueryBuilder的=新SQLiteQueryBuilder();

                串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
                };

                光标C = queryBuilder.query(MDB,asColumnsToReturn,directoryPeople.LAST_NAME +LIKE+ partialValue,空,
                        NULL,NULL,directoryPeople.DEFAULT_SORT_ORDER);


                返回℃;
            }
        });
 

}

下面是我的布局code,按要求。主要布局:

 < XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直
    机器人:背景=@机器人:彩色/白>
    <包括机器人:ID =@ + ID / lytHeadBar布局=@布局/ headbar/>
    <包括机器人:ID =@ + ID / lytTitleBar布局=@布局/标题栏/>
    < EditText上的android:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:提示=输入一个名字......
        机器人:MAXLINES =1机器人:inputType =为TextFilter | textCapWords机器人:ID =@ + ID / search_box/>
    <的ListView
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT
        机器人:ID =@ + ID / listPeople
        机器人:分隔=@机器人:可绘制/ divider_horizo​​ntal_dark
        机器人:cacheColorHint =@机器人:彩色/白/>
< / LinearLayout中>
 
利用数据有效性下拉菜单来筛选,大于或等于100000的数据,和小于100000的数据

列表项的布局:

 < XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / lytItem
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_width =match_parent
    机器人:方向=垂直
    机器人:以下属性来=10dp
    机器人:paddingRight =10dp
    机器人:背景=@可绘制/ item_line_bottom>
    <的LinearLayout机器人:ID =@ + ID / nameLine
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_width =match_parent
        机器人:方向=横向>
            <的TextView
                机器人:ID =@ + ID / txtLastName
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:TEXTSIZE =20SP
                机器人:TEXTSTYLE =黑体
                机器人:文字颜色=@机器人:彩色/黑白
                机器人:文本=姓氏/>
            <的TextView
                机器人:ID =@ + ID / nameSpace1
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:TEXTSTYLE =黑体
                机器人:TEXTSIZE =20SP
                机器人:文字颜色=@机器人:彩色/黑白
                机器人:文本=/>
            <的TextView
                机器人:ID =@ + ID / txtFirstName
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:TEXTSTYLE =黑体
                机器人:TEXTSIZE =20SP
                机器人:文字颜色=@机器人:彩色/黑白
                机器人:文本=名字/>
            <的TextView
                机器人:ID =@ + ID / nameSpace2
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:TEXTSTYLE =黑体
                机器人:TEXTSIZE =20SP
                机器人:文字颜色=@机器人:彩色/黑白
                机器人:文本=/>
            <的TextView
                机器人:ID =@ + ID / txtMiddle
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:TEXTSTYLE =黑体
                机器人:TEXTSIZE =20SP
                机器人:文字颜色=@机器人:彩色/黑白
                机器人:文本=中间/>
        < / LinearLayout中>
    <的LinearLayout机器人:ID =@ + ID / titleLine
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_width =match_parent
        机器人:方向=横向>
        <的TextView
            机器人:ID =@ + ID / txtTitle
            机器人:layout_width =match_parent
            机器人:layout_height =WRAP_CONTENT
            机器人:TEXTSIZE =16SP
            机器人:文字颜色=@机器人:彩色/黑白
            机器人:文本=头衔的Andr​​oid版本:ellipsize =金字招牌/>
    < / LinearLayout中>
< / LinearLayout中>
 

解决方案

最后设法解决这个问题!答案可以在这里找到:ListView, SimpleCursorAdapter,一个一个EditText过滤器 - 为什么不能做任何事情

I have a ListView with a custom item layout backed by a SimpleCursorAdapter. I'd like the user to be able to type text into an EditText box and have the ListView automatically filter as they type. It looks like this is very simple to do with an ArrayAdapter, as described here.

Unfortunately, I'm not having any luck getting it working with a SimpleCursorAdapter. I've tried adding extra methods as described here, but that example is for an AutoCompleteTextView instead of a ListView. I haven't been able to get anything working for my ListView.

Can somebody provide me with an example of filtering a SimpleCursorAdapter-backed ListView with an EditText box?

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;
            }
        });

}

Here's my layout code, as requested. Main layout:

<?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>

List item layout:

<?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>

解决方案

Finally managed to solve the issue! Answer can be found here: ListView, SimpleCursorAdapter, an an EditText filter -- why won't it do anything?