如何过滤/搜索预先填充的SQLite数据的ListView?

时间:2019-07-10 16:30:20

标签: android android-sqlite

我是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 :(得分:0)

在您的onQueryTextChange中,您是使用相同的数组allSongs而不是songList重新创建适配器吗?