gpt4 book ai didi

java - 使用 SQLite 填充 ListView - ListView 附加行但不显示文本

转载 作者:行者123 更新时间:2023-11-30 00:31:57 25 4
gpt4 key购买 nike

我正在尝试用 SQLite 项填充 ListView。在阅读了这里和其他教程/示例中的相关内容后,我尝试了以下代码,但我无法找出问题的确切位置,因为它没有按预期工作,ListView 没有显示任何项目。我的数据库只有一种类型的数据,一种名为sentence 的字符串。感谢任何至少能​​为我指明解决问题方向的帮助。

首先我做了一个FavoritesDataBaseCore.java:

package com.easyprojects.artgames;

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

/**
* Created by Vinicius on 19/05/2017.
*/

public class FavoritesDataBaseCore extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Favorites.db";

public FavoritesDataBaseCore(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table favorite(_id integer primary key autoincrement, sentence text not null)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists favorite");
onCreate(db);
}
}

sentence应该是在CharacterActivity.java中通过点击按钮添加的,相关代码:

ImageButton setFavoriteBtn;
private SQLiteDatabase database;
FavoritesDataBaseCore helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_character);
setFavoriteBtn = (ImageButton) findViewById(R.id.setFavoriteBtnId);
setFavoriteBtn.setOnClickListener(this);
// Database stuff
helper = new FavoritesDataBaseCore(this);
database = helper.getWritableDatabase();
}

// Code below is inside public void onClick(View view)

case R.id.setFavoriteBtnId:
ContentValues values = new ContentValues();
values.put("sentence", characterTV.getText().toString());
database.insert("favorite", null, values);
// A Toast here showing values.toString() works well
break;

最后是包含 ListView 并创建 Cursor 的 Activity,我怀疑问题出在这里,因为 Cursor 主要负责将正确的适配器设置为ListView,FavoritesActivity.java,相关代码:

private SQLiteDatabase database;
FavoritesDataBaseCore helper;

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

helper = new FavoritesDataBaseCore(this);
database = helper.getReadableDatabase();
String[] field = {"sentence"};
int[] to = new int[]{R.id.SentenceAd};

Cursor cursor = getData();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, field, to, 0);

final ListView FavoritesListView = (ListView) findViewById(R.id.listviewID); // ListView
FavoritesListView.setAdapter(adapter);
}

public Cursor getData(){
Cursor cursor;
String[] field = {"sentence"};
cursor = database.query("favorite",null,null,null,null,null,null);

return cursor;
}

我的 database_adapter.xml 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">


<TextView
android:id="@+id/SentenceAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>

编辑:在根据@MikeT 的建议调整代码后,我得出的结论是,每次我向数据库中添加一个值时,我的 ListView 都会追加行,但是句子 永远不会显示在这些行中。

最佳答案

有很多问题。前几个与 Cursor 的创建有关,为 SimpleCursorAdapter 使用它做准备。然后是如何实例化/ssetup SimpleCursorAdpater 的问题。

光标。

游标适配器要求存在名为 _id 的列。为了克服这个问题,游标应该包括两列。完成此操作的最简单方法是使用 null 作为查询方法的第二个参数。

改变

cursor = database.query("favorite",field,null,null,null,null,null); 

cursor = database.query("favorite",null,null,null,null,null,null);

从查询方法返回的 Cursor 不会为 null(cusror.getCount() 是检查没有行的方式),因此不需要或不使用检查它是否为 null。此外,Cursor Adpater(简单或自定义)将执行必要的光标导航。无需移动光标。原文已经过相应编辑,因此无需更改。

最后关于游标,关闭数据库将关闭游标(同样已经编辑过)。

SimpleCursorAdapter

问题是您使用的是 android.R.layout.simple_list_item_1 中提供的布局(第二个参数),这需要您指定哪个 Cursor 列( you have signified sentence) 将显示在它是特定的 TextView 但你已经在你自己的布局中提供了一个 TextView。

改变

int[] to = new int[]{R.id.SentenceAd}; 

int[] to = new int[]{android.R.id.text1};

是解决问题的一种方法,但创建自己的布局会浪费您的时间和精力。

要使用您自己的布局,则不要进行上述更改(因为您需要在布局中使用 TextView 的 id),而是更改

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, field, to, 0);

使用你的布局

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.database_adapter, cursor, field, to, 0); 

简而言之,第 2 个(要使用的布局)和第 4 个(光标中的列,按名称)和第 5 个(其中 TextView 的 ID将放置列中数据的布局)参数相互依赖/相互依赖。

关于java - 使用 SQLite 填充 ListView - ListView 附加行但不显示文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44170565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com