我如何让片段知道ArrayList已更新

时间:2018-09-26 21:28:14

标签: android

所以我有一个自定义对象的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()就可以了。谢谢你们俩的帮助。-((这是很新的内容,所以我不确定是否应该删除该问题,但现在我只保留它)。

2 个答案:

答案 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>