Как я могу фильтровать / искать ListView предварительно заполненных данных SQLite? - PullRequest
0 голосов
/ 10 июля 2019

Я чрезвычайно новичок в Android и работаю над своим первым приложением. Он отображает простую базу данных SQLite, которая находится в моей папке Assets. Действие заполняется этими данными в ListView. У меня есть кнопка поиска, добавленная в строку меню, и я хочу, чтобы пользователи могли использовать ее для фильтрации ListView на основе введенного ими текста.

Я попытался найти несколько разных способов сделать это, но я не могу найти решение, которое подходит именно для этой проблемы. Я пробовал несколько разных вещей, и в настоящее время меню и кнопка поиска работают правильно - это просто не фильтрует.

Это то, что у меня сейчас есть.

MainActivity.java

package com.apps.robloxmusic;

import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private List<String> allSongs = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.listView = (ListView) findViewById(R.id.musicList);
        DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
        databaseAccess.open();
        allSongs = databaseAccess.getSongs();
        databaseAccess.close();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allSongs);
        this.listView.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);


        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                ArrayList<String> songList = new ArrayList<>();

                for (String song : MainActivity.this.allSongs) {
                    if(song.toLowerCase().contains(newText.toLowerCase())) {
                        songList.add(song);
                    }
                }

                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, allSongs);
                listView.setAdapter(adapter);

                return true;

            }
        });


        return super.onCreateOptionsMenu(menu);
    }
}

DatabaseAccess.java

package com.apps.robloxmusic;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

public class DatabaseAccess {
    private SQLiteOpenHelper openHelper;
    private SQLiteDatabase database;
    private static DatabaseAccess instance;

    /**
     * Private constructor to avoid object creation from outside classes.
     *
     * @param context
     */
    private DatabaseAccess(Context context) {
        this.openHelper = new DatabaseOpenHelper(context);
    }

    /**
     * Return a singleton instance of DatabaseAccess.
     *
     * @param context the Context
     * @return the instance of DatabaseAccess
     */
    public static DatabaseAccess getInstance(Context context) {
        if (instance == null) {
            instance = new DatabaseAccess(context);
        }
        return instance;
    }

    /**
     * Open the database connection.
     */
    public void open() {
        this.database = openHelper.getWritableDatabase();
    }

    /**
     * Close the database connection.
     */
    public void close() {
        if (database != null) {
            this.database.close();
        }
    }

    /**
     * Read all quotes from the database.
     *
     * @return a List of songs
     */
    public List<String> getSongs() {
        List<String> list = new ArrayList<>();
        Cursor cursor = database.rawQuery("SELECT * FROM [Music_Codes]", null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            list.add(cursor.getString(0));
            cursor.moveToNext();
        }
        cursor.close();
        return list;
    }
}

Нет сообщений об ошибках с этим кодом, однако он не фильтрует ListView, как предполагалось. Буду признателен за любую помощь и объяснения!

1 Ответ

0 голосов
/ 10 июля 2019

В вашем onQueryTextChange вы воссоздаете адаптер с тем же массивом allSongs вместо songList?

...