gpt4 book ai didi

android - 如何获取光标的实际位置?

转载 作者:行者123 更新时间:2023-11-29 21:58:24 26 4
gpt4 key购买 nike

我正在尝试在我的应用程序中整理收藏夹。我有一个包含三列的数据库:

_id | name  | description |  star

1 London some desc.
2 Berlin some desc.
3 Paris some desc. yes

我想在 ListView 中显示收藏夹。 refreshCursor() 返回带有“star”列值“yes”的名称列表:

private static final String COLUMN_STAR = "star";

private void refreshCursor() {
stopManagingCursor(cursor);
Intent intent = getIntent();
String TABLE_NAME = intent.getStringExtra("tableName");

cursor = database.query(TABLE_NAME, null, COLUMN_STAR + " = ?",
new String[] { "yes" }, null, null, null);

startManagingCursor(cursor);
}

没关系。

然后在我点击 Paris 之后,我发送带有点击位置的额外字符串:

lvData.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String entryID = new Integer(position).toString();

Intent intent = new Intent();
intent.setClass(FavouritesActivity.this, ViewFavsActivity.class);

Bundle b = new Bundle();
b.putString("elementId", entryID);
intent.putExtras(b);
startActivity(intent);
}
});

但是我得到了位置(endtryID)0 并且 ViewFavsActivity 显示了 London 的描述。

如何获取Cursor的实际位置并将其发送到ViewFavsActivity?请帮忙。


部分 FavouritesActivity (onCreate)://refreshCursor 方法在上面

refreshCursor();
String[] from = new String[] { COLUMN_NAME };
int[] to = new int[] { R.id.tvText };

scAdapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor,
from, to);
lvData = (ListView) findViewById(R.id.list);
lvData.setAdapter(scAdapter);

lvData.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String entryID = String.valueOf(id);

Intent intent = new Intent();
intent.setClass(FavouritesActivity.this, ViewFavsActivity.class);

Bundle b = new Bundle();
b.putString("elementId", entryID);
intent.putExtras(b);
startActivity(intent);

部分ViewFavsActivity:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// opening DB

refreshCursor();
bundle = getIntent().getExtras();

TextView titleText = (TextView) findViewById(R.id.titleText);
setTitle = database.query(TABLE_NAME, new String[] { COLUMN_DESC },
null, null, null, null, null);

int entryID = Integer.parseInt(bundle.getString("elementId"));

setTitle.moveToPosition(entryID);
titleText.setText(setTitle.getString(setTitle
.getColumnIndex(COLUMN_DESC)));

}

private void refreshCursor() {
stopManagingCursor(cursor);
Intent intent = getIntent();

cursor = database.query(TABLE_NAME, new String[] { COLUMN_ID, COLUMN_STAR, COLUMN_DESC },
"_id = ? AND star = ?",
new String[] { intent.getStringExtra("elementId"), "yes" },
null, null, null);
}

添加:

FavouritesActivity在 pastebin 上

ViewFavsActivity在 pastebin 上

Project

最佳答案

真正的问题是您使用了两个不同的 Cursor。您从以下位置获得 position == 0:

cursor = database.query(TABLE_NAME, null, COLUMN_STAR + " = ?",
new String[] { "yes" }, null, null, null);

然后要求位置 0 在:

setTitle = database.query(TABLE_NAME, new String[] { COLUMN_DESC },
null, null, null, null, null);

所以你得到不同结果的可能性很大。
此外 Bundle 可以容纳任何原始数据类型和一些更复杂的数据类型。所以你不需要将一个数字转换成一个字符串,然后再转换回它原来的数据类型...

更安全的方法是使用行的 ID,因此请在您的 OnItemClickListener 中使用它:

b.putLong("elementId", id);

ViewFavsActivity 中:

long entryID = bundle.getLong("elementId");
setTitle = database.query(TABLE_NAME, new String[] { COLUMN_DESC },
"_id = " + entryID, null, null, null, null);

(注意:当有疑问时总是使用?query()selectionArgs 参数来防止SQL 注入(inject)攻击,但您正在使用作为索引检索的 long,因此您在这种情况下是安全的。)

关于android - 如何获取光标的实际位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610965/

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