- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经成功开发了一个应用程序,可以将数据插入 SQLite 数据库并在具有自定义布局和适配器的 ListView 中查看它。
但是,当我尝试制作一个根据用户输入过滤结果的 SearchView 时,我一无所获。
下面是我的代码,请指出解决方案
数据库助手
public class DbHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "homeworks.db";
public static final int DB_VERSION = 1;
public static final String createTaksTableQuery =
"CREATE TABLE "+ DbInfo.TasksInfo.TABLE_NAME+"("+DbInfo.TasksInfo.taskId+
" INTEGER PRIMARY KEY AUTOINCREMENT, "+DbInfo.TasksInfo.taskName+" NVARCHAR(255), "
+DbInfo.TasksInfo.taskDate+" DATE, "+DbInfo.TasksInfo.taskTime+" TIME, "+ DbInfo.TasksInfo.taskNotes+" NVARCHAR(255));";
public static final String createNotesTableQuery =
"CREATE TABLE "+ DbInfo.NotessInfo.TABLE_NAME+"("+DbInfo.NotessInfo.noteId+
" INTEGER PRIMARY KEY AUTOINCREMENT, "+DbInfo.NotessInfo.noteName+" NVARCHAR(255), "
+DbInfo.NotessInfo.noteDate+" DATE, "+ DbInfo.NotessInfo.noteContents+" NVARCHAR(255));";
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
Log.e("Database Operation", "Database Created / Opened...");
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createTaksTableQuery);
Log.e("Database Operation", "Tasks Table Created ...");
db.execSQL(createNotesTableQuery);
Log.e("Database Operation", "Notes Table Created ...");
}
public void insertToTasks(String tName, String tDate, String tTime, String taskNote, SQLiteDatabase db) {
ContentValues contentValues = new ContentValues();
contentValues.put(DbInfo.TasksInfo.taskName, tName);
contentValues.put(DbInfo.TasksInfo.taskDate, tDate);
contentValues.put(DbInfo.TasksInfo.taskTime, tTime);
contentValues.put(DbInfo.TasksInfo.taskNotes, taskNote);
db.insert(DbInfo.TasksInfo.TABLE_NAME, null, contentValues);
Log.e("Insertion OP", "Row inserted into Tasks Databases");
}
public void insertToNotes(String nName, String nDate, SQLiteDatabase db) {
ContentValues contentValues = new ContentValues();
contentValues.put(DbInfo.NotessInfo.noteName, nName);
contentValues.put(DbInfo.NotessInfo.noteDate, nDate);
db.insert(DbInfo.NotessInfo.TABLE_NAME, null, contentValues);
Log.e("Insertion OP", "Row inserted into Notes Databases");
}
public Cursor getTasks(SQLiteDatabase db) {
Cursor cursor;
String[] projections = {
DbInfo.TasksInfo.taskId, DbInfo.TasksInfo.taskName, DbInfo.TasksInfo.taskDate, DbInfo.TasksInfo.taskTime, DbInfo.TasksInfo.taskNotes};
cursor = db.query(DbInfo.TasksInfo.TABLE_NAME, projections, null, null, null, null, DbInfo.TasksInfo.taskId + " desc");
return cursor;
}
public Cursor searchTasks(SQLiteDatabase db, String searchTxt) {
Cursor cursor;
String q = "select * from tasksTable where taskName Like '"+searchTxt+"%'";
cursor = db.rawQuery(q, null);
Log.e("Database Op", q);
return cursor;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
主类
public class TasksFragment extends Fragment {
ListView tasksListView;
SQLiteDatabase sqLiteDatabase;
Cursor cursor;
DbHelper dbHelper;
TasksListAdapter adapter;
SearchView searchView;
String searchQuery;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tasks_layout, container, false);
searchView = (SearchView) view.findViewById(R.id.searchView);
tasksListView = (ListView) view.findViewById(R.id.tasksListView);
adapter = new TasksListAdapter(getContext(), R.layout.tasks_row);
dbHelper = new DbHelper(view.getContext());
sqLiteDatabase = dbHelper.getReadableDatabase();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
tasksListView.setVisibility(View.GONE);
return true;
}
});
tasksListView.setAdapter(adapter);
cursor = dbHelper.getTasks(sqLiteDatabase);
if (cursor.moveToFirst()) {
do {
String name, date, time, note;
name = cursor.getString(1);
date = cursor.getString(2);
time = cursor.getString(3);
note = cursor.getString(4);
DataProvider dataProvider = new DataProvider(name, date, time, note);
adapter.add(dataProvider);
} while (cursor.moveToNext());
}
adapter.notifyDataSetChanged();
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getContext(), AddTask.class);
startActivity(intent);
}
});
tasksListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
adapter.notifyDataSetChanged();
return view;
}
}
最佳答案
我已经设法解决了问题...我必须在 SearchView 上创建 onQueryTextChangedListner ,创建一个新的适配器和一个新的游标,从数据库中获取数据然后放入适配器并将新的适配器设置为 ListView
下面是新的最终代码,包含 、insert 、delete 、search"select"和 Delete ,以及 ListView 和 searchView 方法
DbHelper 类
package ly.edu.cet.www.myhomworks;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by newton on 11/19/15.
*/
public class DbHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "homeworks.db";
public static final int DB_VERSION = 1;
public static final String createTaksTableQuery =
"CREATE TABLE "+ DbInfo.TasksInfo.TABLE_NAME+"("+DbInfo.TasksInfo.taskId+
" INTEGER PRIMARY KEY AUTOINCREMENT, "+DbInfo.TasksInfo.taskName+" NVARCHAR(255), "
+DbInfo.TasksInfo.taskDate+" DATE, "+DbInfo.TasksInfo.taskTime+" TIME, "+ DbInfo.TasksInfo.taskNotes+" NVARCHAR(255));";
public static final String createNotesTableQuery =
"CREATE TABLE "+ DbInfo.NotessInfo.TABLE_NAME+"("+DbInfo.NotessInfo.noteId+
" INTEGER PRIMARY KEY AUTOINCREMENT, "+DbInfo.NotessInfo.noteName+" NVARCHAR(255), "
+DbInfo.NotessInfo.noteDate+" DATE, "+ DbInfo.NotessInfo.noteContents+" NVARCHAR(255));";
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
Log.e("Database Operation", "Database Created / Opened...");
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createTaksTableQuery);
Log.e("Database Operation", "Tasks Table Created ...");
db.execSQL(createNotesTableQuery);
Log.e("Database Operation", "Notes Table Created ...");
}
public void insertToTasks(String tName, String tDate, String tTime, String taskNote, SQLiteDatabase db) {
ContentValues contentValues = new ContentValues();
contentValues.put(DbInfo.TasksInfo.taskName, tName);
contentValues.put(DbInfo.TasksInfo.taskDate, tDate);
contentValues.put(DbInfo.TasksInfo.taskTime, tTime);
contentValues.put(DbInfo.TasksInfo.taskNotes, taskNote);
db.insert(DbInfo.TasksInfo.TABLE_NAME, null, contentValues);
Log.e("Insertion OP", "Row inserted into Tasks Databases");
}
public void insertToNotes(String nName, String nDate, SQLiteDatabase db) {
ContentValues contentValues = new ContentValues();
contentValues.put(DbInfo.NotessInfo.noteName, nName);
contentValues.put(DbInfo.NotessInfo.noteDate, nDate);
db.insert(DbInfo.NotessInfo.TABLE_NAME, null, contentValues);
Log.e("Insertion OP", "Row inserted into Notes Databases");
}
public Cursor getTasks(SQLiteDatabase db) {
Cursor cursor;
String[] projections = {
DbInfo.TasksInfo.taskId, DbInfo.TasksInfo.taskName, DbInfo.TasksInfo.taskDate, DbInfo.TasksInfo.taskTime, DbInfo.TasksInfo.taskNotes};
cursor = db.query(DbInfo.TasksInfo.TABLE_NAME, projections, null, null, null, null, DbInfo.TasksInfo.taskId + " desc");
return cursor;
}
public Cursor searchTasks(SQLiteDatabase db, String searchTxt) {
Cursor cursor;
String[] projections = {
DbInfo.TasksInfo.taskId, DbInfo.TasksInfo.taskName, DbInfo.TasksInfo.taskDate,
DbInfo.TasksInfo.taskTime, DbInfo.TasksInfo.taskNotes};
cursor = db.query(DbInfo.TasksInfo.TABLE_NAME, projections, DbInfo.TasksInfo.taskName+" Like '"+searchTxt+"%'", null, null, null, null);
return cursor;
}
public void updateTasks(SQLiteDatabase db, String id, String tname, String tdate, String ttime, String tnote) {
ContentValues values = new ContentValues();
values.put(DbInfo.TasksInfo.taskName, tname);
values.put(DbInfo.TasksInfo.taskDate, tdate);
values.put(DbInfo.TasksInfo.taskTime, ttime);
values.put(DbInfo.TasksInfo.taskNotes, tnote);
int cursor = db.update(DbInfo.TasksInfo.TABLE_NAME, values, DbInfo.TasksInfo.taskId+" = "+id, null);
}
public boolean deleteTasks(SQLiteDatabase db, String id) {
return db.delete(DbInfo.TasksInfo.TABLE_NAME, DbInfo.TasksInfo.taskId+" = "+id, null) >0;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
这是我的 TasksFragment,它在 SwipeView 选项卡内的 MainActivity 上被调用
package ly.edu.cet.www.myhomworks;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
/**
* Created by newton on 11/19/15.
*/
public class TasksFragment extends Fragment {
ListView tasksListView;
SQLiteDatabase sqLiteDatabase;
Cursor cursor;
Cursor scursor;
DbHelper dbHelper;
TasksListAdapter adapter;
SearchView searchView;
String searchQuery;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tasks_layout, container, false);
searchView = (SearchView) view.findViewById(R.id.searchView);
tasksListView = (ListView) view.findViewById(R.id.tasksListView);
adapter = new TasksListAdapter(getContext(), R.layout.tasks_row);
dbHelper = new DbHelper(view.getContext());
sqLiteDatabase = dbHelper.getReadableDatabase();
tasksListView.setAdapter(adapter);
cursor = dbHelper.getTasks(sqLiteDatabase);
if (cursor.moveToFirst()) {
do {
String name, date, time, note;
name = cursor.getString(1);
date = cursor.getString(2);
time = cursor.getString(3);
note = cursor.getString(4);
DataProvider dataProvider = new DataProvider(name, date, time, note);
adapter.add(dataProvider);
} while (cursor.moveToNext());
}
adapter.notifyDataSetChanged();
tasksListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (cursor != null) {
if (cursor.moveToFirst()) {
cursor.moveToPosition(position);
String listId = cursor.getString(cursor.getColumnIndex(DbInfo.TasksInfo.taskId));
String listName = cursor.getString(cursor.getColumnIndex(DbInfo.TasksInfo.taskName));
String listDate = cursor.getString(cursor.getColumnIndex(DbInfo.TasksInfo.taskDate));
String listTime = cursor.getString(cursor.getColumnIndex(DbInfo.TasksInfo.taskTime));
String listNote = cursor.getString(cursor.getColumnIndex(DbInfo.TasksInfo.taskNotes));
Intent updateTasksIntent = new Intent(getContext(), AddTask.class);
updateTasksIntent.putExtra("editTask", true);
updateTasksIntent.putExtra("taskId", listId);
updateTasksIntent.putExtra("taskName", listName);
updateTasksIntent.putExtra("taskDate", listDate);
updateTasksIntent.putExtra("taskTime", listTime);
updateTasksIntent.putExtra("taskNote", listNote);
// Toast.makeText(getContext(), "List row " + position + " ID = " + listId, Toast.LENGTH_SHORT).show();
startActivity(updateTasksIntent);
}
}
}
});
tasksListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (cursor != null) {
if (cursor.moveToFirst()) {
cursor.moveToPosition(position);
String listId = cursor.getString(cursor.getColumnIndex(DbInfo.TasksInfo.taskId));
Log.e("Database Op", "List row " + position + " ID = " + listId);
dbHelper.deleteTasks(sqLiteDatabase, listId);
TasksListAdapter newAdapter = new TasksListAdapter(getContext(), R.layout.tasks_row);
cursor = dbHelper.getTasks(sqLiteDatabase);
if (cursor.moveToFirst()) {
do {
String name, date, time, note;
name = cursor.getString(1);
date = cursor.getString(2);
time = cursor.getString(3);
note = cursor.getString(4);
DataProvider dataProvider = new DataProvider(name, date, time, note);
newAdapter.add(dataProvider);
} while (cursor.moveToNext());
}
newAdapter.notifyDataSetChanged();
tasksListView.setAdapter(newAdapter);
// Toast.makeText(getContext(), "List row " + position + " ID = " + listId, Toast.LENGTH_SHORT).show();
}
}
return true;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
TasksListAdapter searchAdapter = new TasksListAdapter(getContext(), R.layout.tasks_row);
scursor = dbHelper.searchTasks(sqLiteDatabase, newText);
if (scursor.moveToFirst()) {
do {
String name, date, time, note;
name = scursor.getString(1);
date = scursor.getString(2);
time = scursor.getString(3);
note = scursor.getString(4);
DataProvider dataProvider = new DataProvider(name, date, time, note);
searchAdapter.add(dataProvider);
} while (scursor.moveToNext());
}
tasksListView.setAdapter(searchAdapter);
searchAdapter.notifyDataSetChanged();
return true;
}
});
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent addTaskIntent = new Intent(getContext(), AddTask.class);
addTaskIntent.putExtra("addNewTask", true);
startActivity(addTaskIntent);
}
});
return view;
}
}
祝你们好运:)穆罕默德·格里利
关于android - SearchView 将结果从数据库显示到 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849446/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!