所以我有一个自定义对象的ArrayList和一个适配器,以通过ListView显示内容。您可以在ListView中单击单独的对象,然后会展开一个小动画,并显示一些其他信息。此行为是在ArrayAdapter中定义的(因为直接在createView()中使用动画时,动画无法达到我想要的效果。
现在,如果单击列表视图元素的小图像(X-以删除),则会弹出一个提示对话框,询问您是否确定要删除该项目。如果单击“是”,则将其从数组列表中删除,但notifyDataSetChanged();不会刷新适配器,并且不会调用onResume或类似的东西,因为我从不隐藏该片段,只是对其发出了警报。
这是一个粗略的代码,是我的ArrayAdapter的一部分:
deleteIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
ArrayList<Book> XYZ = sharedFunctions.loadSortedArrayList(getContext());
XYZ.remove(position);
sharedFunctions.saveArrayList(context, XYZ);
notifyDataSetChanged();
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("BLABLA").setNegativeButton("Cancel", dialogClickListener).setPositiveButton("Confirm", dialogClickListener).show();
}
});
那么我如何告诉Fragment(这是一个标签页)数据已更改?
编辑: 因此,我认为以下答案在技术上是正确的,但我发现我只是在做错了所有事情。我从ArrayList(已在SharedPreferences中加载/保存)中删除了该项目,而不是从用于构造适配器的ArrayList中删除了该项目。愚蠢的错误TBH。一旦我也从那里删除了它,notifyDataSetChanged()就可以了。谢谢你们俩的帮助。-((这是很新的内容,所以我不确定是否应该删除该问题,但现在我只保留它)。
答案 0 :(得分:0)
您必须通过片段管理器访问您的片段。下面是一个示例方法:
ExampleFragment fragment = (ExampleFragment) getChildFragmentManager().findFragmentByTag("theTagThatFragmentSavedInFragmentManagerWith");
if (fragment != null) fragment.notifyItemChanged(itemPosition);
答案 1 :(得分:0)
为此,您也可以使用localbroadcastreciever。在要刷新的片段中定义并注册本地广播,然后从适配器调用该广播,然后删除正向点击。在onRecieve广播中,只需检查您的适配器不为null并这样做
<script type="text/javascript">
window.onload = function() {
window.addEventListener('message', function(event) {
if (event.origin.indexOf(window.location.url)) {
event.data.forEach(element => {
document.getElementById('passwords').appendChild(parseView(element, 'password-template'));
});
} else {
return;
}
});
};
document.getElementsByClassName('copy-btn').addEventListener('click', function() {
this.contentWindow.postMessage(this.copy-data, '*');
}, false);
function parseView(object, template_id) {
let template = document.getElementById(template_id).innerHTML;
for (const key in object) {
if(template.indexOf('{{'+key+'}}') != -1) {
var regex = new RegExp("{{" + key + "}}", "g");
template = template.replace(regex, object[key]);
}
}
var parser = new DOMParser()
var doc = parser.parseFromString(template, "text/html");
return doc.body.firstChild;
}
</script>