当我单击ListView中的项目时,我想在Editite中填充其值以便在SQLite数据库中进行更新

时间:2018-03-06 07:10:57

标签: java android

我正在打开一个新活动,它使用CursorLoader从本地SQLite db获取数据。每当我点击listitem时,由于某种原因它总是填充第一项的值。我想填充我单击的特定列表项的值。例如:如果我点击“观看”项目,它仍会在Edittext中填充“预订”值。我在这里错过了什么吗?

App Screenshot

这是我的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);

}

2 个答案:

答案 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匹配。

最后一个有点复杂和冗长,所以尽量只使用第一个或第二个。