我正在打开一个新活动,它使用CursorLoader
从本地SQLite
db获取数据。每当我点击listitem时,由于某种原因它总是填充第一项的值。我想填充我单击的特定列表项的值。例如:如果我点击“观看”项目,它仍会在Edittext
中填充“预订”值。我在这里错过了什么吗?
这是我的CursorLoader代码:
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
String[] projection = {
ItemContract.ItemEntry._ID,
ItemContract.ItemEntry.COLUMN_ITEM_NAME,
ItemContract.ItemEntry.COLUMN_ITEM_QUANTITY,
ItemContract.ItemEntry.COLUMN_ITEM_PRICE,
ItemContract.ItemEntry.COLUMN_ITEM_IMAGE
};
return new CursorLoader(this, ItemContract.ItemEntry.CONTENT_URI,projection,null,null,null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor == null || cursor.getCount() < 1) {
return;
}
if (cursor.moveToFirst()) {
int nameColumnIndex = cursor.getColumnIndex(ItemContract.ItemEntry.COLUMN_ITEM_NAME);
int quantityColumnIndex = cursor.getColumnIndex(ItemContract.ItemEntry.COLUMN_ITEM_QUANTITY);
int priceColumnIndex = cursor.getColumnIndex(ItemContract.ItemEntry.COLUMN_ITEM_PRICE);
int imageColumnIndex = cursor.getColumnIndex(ItemContract.ItemEntry.COLUMN_ITEM_IMAGE);
String editCurrentName = cursor.getString(nameColumnIndex);
int editCurrentQuantity = cursor.getInt(quantityColumnIndex);
Float editCurrentPrice = cursor.getFloat(priceColumnIndex);
String editCurrentImage = cursor.getString(imageColumnIndex);
if(editCurrentImage != null) {
editImage.setVisibility(View.VISIBLE);
editImage.setImageURI(Uri.parse(editCurrentImage));
}
else {
editImage.setVisibility(View.GONE);
}
editName.setText(editCurrentName);
editQuantity.setText(Integer.toString(editCurrentQuantity));
editPrice.setText(Float.toString(editCurrentPrice));
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
Log.e("EDITACTIVITY", "onLoaderReset: ");
editName.setText("");
editQuantity.setText("");
editPrice.setText("");
editImage.setImageDrawable(null);
}
答案 0 :(得分:0)
如果您从Cursor
或AnyView的位置检索ListView
,这将是一个问题。从Cursor
或AnyView本身的onItemClickListener
中获取的ListView
中检索值的方法:
public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
//Get the cursor, positioned to the corresponding row in the result set
Cursor cursor = (Cursor) listView.getItemAtPosition(position);
// Use the Cursor to retrieve the value from here!
}
答案 1 :(得分:0)
你很简单地加载游标,所以没有传递条件它将返回所有数据,然后你也获取第一行数据。所以它只会在所有场景中返回第一个数据。
<强>解决方案强>
在这种情况下,您可以使用三种解决方案。
<强>解决方法1:强>
当用户点击项目时,您可以获取项目对象并将值传递给编辑活动。
这样的事情:[http://www.viralandroid.com/2016/04/start-new-activity-from-android-listview-onitem-clicked.html][1]
<强>溶液2:强>
当用户点击项目时,此时只获取项目ID并传递给编辑活动。现在你必须在游标加载器中传递如下所示的参数。
// Here I am storing passed id in one variable, you have to set selected_item_id in intent while starting new activity
int selectedId = getIntent().getExtras().getInt("selected_item_id",0);
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
String[] projection = {
ItemContract.ItemEntry._ID,
ItemContract.ItemEntry.COLUMN_ITEM_NAME,
ItemContract.ItemEntry.COLUMN_ITEM_QUANTITY,
ItemContract.ItemEntry.COLUMN_ITEM_PRICE,
ItemContract.ItemEntry.COLUMN_ITEM_IMAGE
};
String selection = ItemContract.ItemEntry._ID + "=?";
String[] selectionArgs = { String.valueOf(selectedId) };
return new CursorLoader(this, ItemContract.ItemEntry.CONTENT_URI,projection, selection ,selectionArgs ,null);
}
现在,您将获得实际结果。
在第三个解决方案中,您必须使用自己的方法进行加载,然后在完成后,您必须逐个获取游标数据,然后与selectedId匹配。
最后一个有点复杂和冗长,所以尽量只使用第一个或第二个。