当我回到android

时间:2017-10-19 08:21:52

标签: android android-recyclerview

在我的应用中,我有Activity,在此Activity中,它会在RecyclerViewAdapter的帮助下显示项目列表,并从中获取项目数据库。

在数据库中,我有一个名为Place的表,其中包含7个字段,其中一个字段为interest,默认值为0,整数数据类型为。

当我点击列表中的某个项目时,会打开新的Activity,其中包含该项目的所有详细信息。其中一个细节是interest。 c 带有interest图标的Star的值。如果值为0,则图标为黑色,否则为金色。

那部分有效。单击Star图标时,数据库中的图标和interest字段的值成功更改。但是,我的问题是:

当我回到Activity显示项目列表并返回该特定项目时,Star图标的更改不会反映出来。示例:首先图标为黑色,我通过单击更改图标以更改为黄金并将interest字段的值更新为1.仅当我完全关闭应用程序并再次重新打开时,更改为正确显示。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您必须将已更改的Place对象从All Details Activity传递回项目列表Activity,然后通知并更改适配器中的项目。

首先,你必须通过听取结果开始一项活动:

Intent intent = new Intent(this, AllDetailsActivity.class)
intent.putExtra("place", place);
startActivityForResult(intent, 1000)

当您在所有详细信息屏幕上更改并确认更改时,您必须返回更改的对象和结果,如下所示:

setResult(Activity.RESULT_OK, new Intent().putExtra("returned_place", place));

然后你必须在Activity里面实现 onActivityResult ,你有一个像这样的对象列表:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if(request == 1000 && resultCode == Activity.RESULT_OK) {
        adapter.changeItem(position, (Place) 
        data.getExtras().get("returned_place"))
     }
}

用于更改项目的适配器功能应该是这样的:

public void changeItem(int position, Place place) {
    items.set(position, place);
    notifyItemChanged(position);
}

您还必须保存单击的Place对象的位置,以了解您必须更新的单元格。

答案 1 :(得分:2)

如果您不确定您所处的recyclerView中数据的位置,可以从适配器调用PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL; PyObject *comp = NULL, *eval = NULL; char code[] = {"A=undef_var"}; comp = Py_CompileString(code, "", Py_file_input); if (comp) { eval = PyEval_EvalCode(comp, PyEval_GetBuiltins(), NULL); } if (!comp || !eval) { PyErr_PrintEx(1); // inside this function the PyErr_Fetch(ptype, pvalue, ptraceback) is called // retrieve the information gained from PyErr_Fetch() called inside PyErr_PrintEx(1) pvalue = PySys_GetObject("last_value"); ptype = PySys_GetObject("last_type"); ptraceback = PySys_GetObject("last_traceback"); PyErr_NormalizeException(ptype, pvalue, ptraceback); PyObject* line_no = PyObject_GetAttrString(pvalue,"lineno"); if (line_no) { PyObject* line_no_str = PyObject_Str(line_no); PyObject* line_no_unicode = PyUnicode_AsEncodedString(line_no_str,"utf-8", "Error"); char *actual_line_no = PyBytes_AsString(line_no_unicode); } } 方法。

最好从适配器调用notifyDataSetChanged()方法,仅更新该特定recyclerView对象的视图。