Я чрезвычайно новичок в 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, как предполагалось. Буду признателен за любую помощь и объяснения!