Android_ SearchView не работает должным образом - PullRequest
0 голосов
/ 19 января 2019

работает в приложении контактов. Я сохранил список контактов в базе данных, используя 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;
}
...