SearchView возвращает пустой listview

У меня есть main Activitywith SearchViewи custom ListView, когда я нажимаю на SearchViewнего, не фильтрует элементыListView, но показывает только один элемент, когда я закончил писать, и при очистке SearchViewон не возвращается к main ListView.

Пожалуйста помочь,
Спасибо

public class MainActivity extends AppCompatActivity {
    private ListView listView;
    List<WordTranslation> quotes;
    Context context;
    Adapter adapter;
    Button searchBtn;
    ArrayList <WordTranslation> arrayList = new ArrayList<>();
    WordTranslation wordTranslation;
    DatabaseAccess databaseAccess;
    SearchView sv;
    EditText editText;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    protected void onStart() {
        super.onStart();

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

    public  ArrayList<WordTranslation> getwordtranslation(String SearchItem){
       arrayList.clear();

        Log.e("get word" , "open" );
        wordTranslation = null;
        Cursor cursor = retrieve(SearchItem);
        System.out.println(SearchItem);

        while (cursor.moveToNext()){
            String word = cursor.getString(0);
            String translation = cursor.getString(1);
            WordTranslation wordTranslation1 = new        WordTranslation(word,translation);
            arrayList.add(wordTranslation1);
        }

        ArrayAdapter<WordTranslation> adapter = new Adapter(this, R.layout.activity_list_view_item,arrayList );
        listView.setAdapter(adapter);
        Log.e("get word" , arrayList.toString() );

        return arrayList;
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.ListView);
        listView.setTextFilterEnabled(true);
        sv = (SearchView) findViewById(R.id.search_view);
        DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
        databaseAccess.open();
        databaseAccess.getQuotes();
        quotes = databaseAccess.ShowDictionaryDetails();
        databaseAccess.close();
        ArrayAdapter<String> adapter = new Adapter(this,    R.layout.activity_list_view_item, quotes);
        listView.setAdapter(adapter);

        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                Toast.makeText(MainActivity.this, "search loading .....", Toast.LENGTH_LONG).show();
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
               getwordtranslation(newText);

                listView.clearTextFilter();


                return false;
            }
        });
    }    

    public Cursor retrieve(String name){
        DatabaseOpenHelper databaseOpenHelper = new DatabaseOpenHelper(this);
        SQLiteDatabase data =databaseOpenHelper.getReadableDatabase();
        String table = "quotes";
        String where = "word = ? ";
        String [] whereargs = {name};
        Log.e("retrieve", whereargs.toString());
        return data.query(table , null ,where , whereargs ,null, null, null );
    }
}

Действие журнала

E/get word: open I/SQLiteAssetHelper: successfully opened database quotes.db      E/retrieve: [Ljava.lang.String;@408fb608 E/get word: [] E/get word: open I/SQLiteAssetHelper: successfully opened database quotes.db E/retrieve: [Ljava.lang.String;@40a6f900 E/get word: [] E/get word: open I/SQLiteAssetHelper: successfully opened database quotes.db E/retrieve: [Ljava.lang.String;@40a748b0 E/get word: [] 

1 ответ

  1. Это потому, что вы фильтруете даже пустую строку. Если значение SearchViewстановится пустым, вы retrieve()получаете пустую строку в качестве аргумента, а запрос базы данных выглядит следующим образом:

    SELECT * FROM quotes WHERE word = ''
    

    И похоже, что нет записи со словом, равным пустой строке.

    Чтобы исправить это, в вашем retrieve()вы должны проверить, если nameпусто, то выберите все данные без WHERE