【问题标题】:notifyDataSetChanged() method not workingnotifyDataSetChanged() 方法不起作用
【发布时间】:2016-01-07 09:02:51
【问题描述】:

我正在使用RecyclerView,在用户输入后我想更新RecyclerView。但根本什么也没有发生。 当我再次重新加载整个 Fragment 时,布局刚刚刷新。

我的代码:

    package com.stack.overflow.fragment.Einstellungen;

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

    import com.stack.overflow.HelperClasses.RecyclerView.DividerItemDecoration;
    import com.stack.overflow.HelperClasses.RecyclerView.ItemClickSupport;
    import com.stack.overflow.R;
    import com.stack.overflow.fragment.Einstellungen.QrCode.FragmentQrCode;
    import com.afollestad.materialdialogs.MaterialDialog;
    import com.pixplicity.easyprefs.library.Prefs;

    import java.util.ArrayList;
    import java.util.List;

    public class FragmentEinstellungen extends Fragment {
        private static final String KEY_STUFE = "Stufe";
        private static final String DEFAULT_EINTRAG_STUFE = "keine Stufe ausgewählt";

        private RecyclerView mRecyclerView;
        private EinstellungenDataAdapter mAdapter;
        private static String[] titles = null;
        private static String[] titlesStufen = null;
        private static String[] titlesKlassen = null;

        int callbackDialog;
        String stufe = "";

        public FragmentEinstellungen(){}

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            titles = getActivity().getResources().getStringArray(R.array.einstellungen);
            titlesStufen = getActivity().getResources().getStringArray(R.array.stufenauswahl);
            titlesKlassen = getActivity().getResources().getStringArray(R.array.klassenauswahl);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View layout = inflater.inflate(R.layout.fragment_einstellungen, container, false);
            mRecyclerView = (RecyclerView) layout.findViewById(R.id.einstellungenRecyclerView);

            mAdapter = new EinstellungenDataAdapter(getActivity(), getData());
            mRecyclerView.setAdapter(mAdapter);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

            final ItemClickSupport itemClick = ItemClickSupport.addTo(mRecyclerView);

            itemClick.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
                @Override
                public void onItemClick(RecyclerView parent, View child, int position, long id) {

                     //SnackbarManager.show(
                     //       Snackbar.with(getActivity())
                     //               .text("KLICK"));

                     displayView(0);
                }
            });

            return layout;
        }

        public static List<EinstellungenItem> getData() {
            List<EinstellungenItem> data = new ArrayList<>();

            // preparing navigation drawer items
            for (int i = 0; i < titles.length; i++) {
                EinstellungenItem navItem = new EinstellungenItem();
                navItem.setTitle(titles[i]);

                if(i==0){
                    navItem.setSubtitle("kein gültiger Scan");
                } else if(i==1){
                    navItem.setSubtitle(Prefs.getString(KEY_STUFE, DEFAULT_EINTRAG_STUFE));
                }

                data.add(navItem);
            }
            return data;
        }

 private void displayView(int position) {

        switch (position) {
            case 0:
            break;
            case 1:

                new MaterialDialog.Builder(getActivity())
                        .title(R.string.title_dialog_stufe)
                        .items(R.array.stufenauswahl)
                        .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
                            @Override
                            public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
                                callbackDialog = which;

                                stufe = titlesStufen[which];


                                if (callbackDialog <= 4) {
                                    new MaterialDialog.Builder(getActivity())
                                            .title(R.string.title_dialog_klasse)
                                            .items(R.array.klassenauswahl)
                                            .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {
                                                @Override
                                                public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {

                                                    stufe = stufe + titlesKlassen[which];

                                                    Prefs.putString(KEY_STUFE, stufe);
                                                    mAdapter.notifyDataSetChanged();

                                                    return true;
                                                }
                                            })
                                            .positiveText(R.string.choosetext_dialog_klasse)
                                            .show();


                                } else {

                                    Prefs.putString(KEY_STUFE, stufe);
                                    mAdapter.notifyDataSetChanged();
                                }

                                return true;
                            }
                        })
                        .positiveText(R.string.choosetext_dialog_stufe)
                        .show();

                callbackDialog = 0;

            break;
            default:
                break;
        }


    }

}

我是否在错误的时间进行刷新?

【问题讨论】:

  • 用户输入在哪里,何时应该触发刷新?每次击键后?
  • 用户输入来自 MaterialDialog。一旦用户选择了一个选项,对话框就会自行关闭,结果将与 SharedPreferences 一起保存。我想在那一刻刷新,以便用户输入将出现在字幕文本视图中
  • 嗯,我猜通知是在错误的地方。 onSelection是点击回调函数吗?那么你应该把mAdapter.notifyDataSetChanged();放在这个方法的这个sn-p中,而不是放在外面。
  • 是的,onSelection是点击回调函数。我在里面放了 mAdapter.notifyDataSetChanged 函数。但是 recyclerView 仍然没有更新。在调试器中,应用程序正在通过该代码。

标签: android refresh android-recyclerview dataadapter


【解决方案1】:

您的mAdapter 使用getData(),它每次返回new ArrayList&lt;&gt;() 的另一个实例,当您调用mAdapter.notifyDataSetChanged(); 时,适配器尝试刷新arrayList 的旧实例,但没有任何更改。

您需要将数据保存到字段中并更新该字段,例如 mArrayList.clear()mArrayList.addAll(getData())

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多