работает в приложении контактов. Я сохранил список контактов в базе данных, используя ContentProvider и SQLite, и отобразил элементы списка, используя CursorLoader.
Я пытаюсь добавить функцию поиска, но окно поиска не работает должным образом, когда я вводю какой-либо текст в окне поиска, он принимает только один символ, и я не могу выйти из него или добавить что-либо еще ..
вот пункт поиска в моем файле меню
<item
android:id="@+id/search_action_id"
android:title="@string/search"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always"
app:actionViewClass="android.widget.SearchView">
</item>
вот мой метод onCreateOptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main_activity, menu);
searchView= (SearchView) menu.findItem(R.id.search_action_id)
.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Bundle queryBundle=new Bundle();
queryBundle.putString("searchquery",newText);
getLoaderManager().restartLoader(CONTACT_LOADER,
queryBundle,
MainActivity.this);
return true;
}
});
return true;
}
и вот мой onCreateLoader
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String selection=null;
String[] selectionArgs=null;
String[] projection = {ContactEntry._ID,
ContactEntry.COLUMN_CONTACT_IMAGE,
ContactEntry.COLUMN_FULLNAME,
ContactEntry.COLUMN_MOBILE,
ContactEntry.COLUMN_EMAIL};
if(args!=null){
selection =ContactEntry.COLUMN_FULLNAME+" LIKE ?";
selectionArgs=new String[]{"%"+args.getString("searchquery")+"%"};
}
return new CursorLoader(getApplicationContext(),
ContactEntry.CONTENT_URI,
projection,
selection,
selectionArgs,
null);
}
и вот метод запроса в классе ContactProvider
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
SQLiteDatabase db=contactDbHelper.getReadableDatabase();
Cursor cursor;
int match=sUriMatcher.match(uri);
switch (match){
case CONTACTS:
cursor=db.query(ContactEntry.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
break;
case CONTACT_ID:
selection=ContactEntry._ID+"=?";
selectionArgs=new String[]{String.valueOf(ContentUris.parseId(uri))};
cursor=db.query(ContactEntry.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
break;
default:
throw new IllegalArgumentException("Cannot query unknown URI " + uri);
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}