在我的应用中,我有Activity
,在此Activity
中,它会在RecyclerView
,Adapter
的帮助下显示项目列表,并从中获取项目数据库。
在数据库中,我有一个名为Place
的表,其中包含7个字段,其中一个字段为interest
,默认值为0,整数数据类型为。
当我点击列表中的某个项目时,会打开新的Activity
,其中包含该项目的所有详细信息。其中一个细节是interest
。 c
带有interest
图标的Star
的值。如果值为0,则图标为黑色,否则为金色。
那部分有效。单击Star
图标时,数据库中的图标和interest
字段的值成功更改。但是,我的问题是:
当我回到Activity
显示项目列表并返回该特定项目时,Star
图标的更改不会反映出来。示例:首先图标为黑色,我通过单击更改图标以更改为黄金并将interest
字段的值更新为1.仅当我完全关闭应用程序并再次重新打开时,更改为正确显示。
有什么想法吗?
答案 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对象的视图。