ArrayList инициализируется каждый раз, когда открывается CustomDialogFragment - PullRequest
0 голосов
/ 29 мая 2019

Я использую Arraylist в CustomDialogFragment для хранения значений каждый раз, когда пользователь устанавливает флажок.И удаляет значения, когда пользователь снимает флажок.Проблема в том, что каждый раз, когда пользователь закрывает диалоговое окно, значения в массиве списков удаляются.Я думаю, что это происходит из-за повторной инициализации массива каждый раз, когда пользователь открывает диалоговое окно.

Я думал сохранить массив в общих настройках, но не уверен, является ли это правильным способом сделать это.Пожалуйста, предложите мне, как это сделать эффективно.

CarTypeDialogFragment.java

public class CarTypeDialogFragment extends DialogFragment {

public interface OnInputListener {
    void sendInput(String input);
}

public OnInputListener mOnInputListener;

CheckBox type1, type2, type4;
String SedanCheckBoxesVal, SUVCheckBoxesVal, HatchBackCheckBoxesVal;

ArrayList<String> myList = new ArrayList<String>();
View v;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    if (getArguments() != null) {
        //totalCars = getArguments().getString("cars","");
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (v != null) {
        if ((ViewGroup) v.getParent() != null)
            ((ViewGroup) v.getParent()).removeView(v);
        return v;
    }
    v = inflater.inflate(R.layout.fragment_restype_dialog, container, false);


    type1 = (CheckBox) v.findViewById(R.id.checkBox);
    type1.setChecked(getFromSP("cb1"));

    type2 = (CheckBox) v.findViewById(R.id.checkBox2);
    type2.setChecked(getFromSP("cb2"));

    type4 = (CheckBox) v.findViewById(R.id.checkBox4);
    type4.setChecked(getFromSP("cb4"));

    type1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (((CheckBox) view).isChecked()) {
                SedanCheckBoxesVal = "'Accord','Avlon','Challenger'";
                saveInSp("cb1", true);
                myList.add(SedanCheckBoxesVal);
                mOnInputListener.sendInput(TextUtils.join("", myList));
                saveInSp("cb1enable", false);

            } else {
                myList.remove(SedanCheckBoxesVal);
                mOnInputListener.sendInput(TextUtils.join("", myList));
                saveInSp("cb1", false);
            }
         }
    });


    type2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //is chkIos checked?

            if (((CheckBox) view).isChecked()) {
                SUVCheckBoxesVal = "'GMC','BMW'";
                saveInSp("cb2", true);
                myList.add(SUVCheckBoxesVal);
                mOnInputListener.sendInput(TextUtils.join("", myList));
                saveInSp("cb2enable", false);

            } else {
                myList.remove(SUVCheckBoxesVal);
                mOnInputListener.sendInput(TextUtils.join("", myList));
                saveInSp("cb2", false);
            }
        }
    });


    type4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //is chkIos checked?

            if (((CheckBox) view).isChecked()) {
                HatchBackCheckBoxesVal = "'Polo','Micra','MiniCooper'";
                saveInSp("cb4", true);
                myList.add(HatchBackCheckBoxesVal);
                mOnInputListener.sendInput(TextUtils.join("", myList));
                saveInSp("cb4enable", false);
                type4.setEnabled(false);

            } else {
                myList.remove(HatchBackCheckBoxesVal);
                mOnInputListener.sendInput(TextUtils.join("", myList));
                mOnInputListener.sendInput("");
                saveInSp("cb4", false);
            }
        }
    });
    return v;
}

private boolean getFromSP(String key) {
    SharedPreferences preferences = getContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
    return preferences.getBoolean(key, false);
}

private void saveInSp(String key, boolean value) {
    SharedPreferences preferences = getContext().getSharedPreferences("PROJECT_NAME", android.content.Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean(key, value);
    editor.commit();

}

@Override
public void onStart() {
    super.onStart();

    Window window = getDialog().getWindow();
    WindowManager.LayoutParams windowParams = window.getAttributes();
    windowParams.dimAmount = 0.00f;
    windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
    window.setAttributes(windowParams);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    try {
        mOnInputListener = (OnInputListener) getActivity();
    } catch (ClassCastException e) {
        Log.e(TAG, "onAttach: ClassCastException: " + e.getMessage());
    }
}

@Override
public void onDestroyView() {
    //workaround for this issue: https://code.google.com/p/android/issues/detail?id=17423 (unable to retain instance after configuration change)
    if (getDialog() != null && getRetainInstance())
        getDialog().setDismissMessage(null);
    super.onDestroyView();
}
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы правы, что ArrayList повторно инициализируется, чтобы быть пустым при каждом закрытии и повторном открытии диалога. Чтобы сохранить это состояние при повторном открытии, вам необходимо сохранить его до закрытия диалогового окна и загрузить его при открытии диалогового окна, как вы делаете это с проверенными состояниями флажков в настоящее время. Использование SharedPrefs для этого нормально, так как ваш список невелик.

Однако из того, что я вижу, вы добавляете элементы в список на основе проверенных состояний (которые уже сохраняются). Таким образом, вы должны иметь возможность использовать их для составления списка, не сохраняя его тоже.

Например:

if (getFromSP("cb1")) {
    myList.add("'Accord','Avlon','Challenger'")
}

и аналогичные для других флажков. Это можно сделать в onCreateView сразу после getFromSP и использовать его для setChecked.

0 голосов
/ 29 мая 2019

Это нормально, чтобы сохранить список строк в SharedPreferences, учитывая, что вы не сохраняете много данных.

В этом случае можно сохранить ваш список в SharedPreferences.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...