Note that there are some explanatory texts on larger screens.

plurals
  1. POUsing an EditText to filter a SimpleCursorAdapter-backed ListView
    primarykey
    data
    text
    <p>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 <a href="https://stackoverflow.com/questions/1737009/how-to-make-a-nice-looking-listview-filter-on-android/1737042#1737042">here</a>.</p> <p>Unfortunately, I'm not having any luck getting it working with a SimpleCursorAdapter. I've tried adding extra methods as described <a href="http://androidcookbook.oreilly.com/Recipe.seam;jsessionid=CE37400B3E545937B70BE2E9F94E78BB?recipeId=404" rel="nofollow noreferrer">here</a>, but that example is for an AutoCompleteTextView instead of a ListView. I haven't been able to get anything working for my ListView.</p> <p>Can somebody provide me with an example of filtering a SimpleCursorAdapter-backed ListView with an EditText box?</p> <pre><code>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; } }); </code></pre> <p>}</p> <p>Here's my layout code, as requested. Main layout:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;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"&gt; &lt;include android:id="@+id/lytHeadBar" layout="@layout/headbar" /&gt; &lt;include android:id="@+id/lytTitleBar" layout="@layout/titlebar" /&gt; &lt;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"/&gt; &lt;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" /&gt; &lt;/LinearLayout&gt; </code></pre> <p>List item layout:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;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"&gt; &lt;LinearLayout android:id="@+id/nameLine" android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="horizontal"&gt; &lt;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" /&gt; &lt;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=", " /&gt; &lt;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" /&gt; &lt;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=" " /&gt; &lt;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" /&gt; &lt;/LinearLayout&gt; &lt;LinearLayout android:id="@+id/titleLine" android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="horizontal"&gt; &lt;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"/&gt; &lt;/LinearLayout&gt; &lt;/LinearLayout&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload