Фрагмент и Адаптер, как передать позицию переключателя внутри списка - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно сохранить с sharedPreferences состояние переключателя (вкл / выкл).Переключатель внутри listiview, который находится внутри фрагмента.В адаптере у меня есть setOnCheckedChangeListener для переключателя, просто чтобы изменить цвет фона каждого элемента в списке.Проблема в том, что я не хочу использовать sharedPreferences внутри адаптера класса (я не думаю, что это хорошая практика).Внутри FragmentReport я написал метод для загрузки и сохранения состояния.

Это метод внутри «FragmentReport»:

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

    final View rootView = inflater.inflate(R.layout.report_fragment, container, false);
    final ListView listView = rootView.findViewById(R.id.report_lv);
    final View childView = 
    getActivity().getLayoutInflater().inflate(R.layout.report_list_view, null);
    paidCard = childView.findViewById(R.id.paid_cardview);
    paidSwitch = childView.findViewById(R.id.paid_switch);
     .......

     public void load_switch_state(){

    SharedPreferences sharedPreferences = getActivity().getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    paidSwitch.setChecked(sharedPreferences.getBoolean("switch_check", true));
    if (paidSwitch.isChecked()) {
        // Set green background
        paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
    }

}

public void save_switch_state(Switch paidSwitch){
    SharedPreferences sharedPreferences = getActivity().getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean("switch_check", paidSwitch.isChecked());
    Log.v("saved", String.valueOf(paidSwitch.isChecked()));
    editor.apply();
}

Затем в моем «ReportAdapter» это метод getView:

public View getView(final int position, View convertView, ViewGroup parent) {
    convertView = inflater.inflate(R.layout.report_list_view, null);
    TextView debtor = convertView.findViewById(R.id.debtor_tv);
    TextView receiver = convertView.findViewById(R.id.receiver);
    TextView difference = convertView.findViewById(R.id.difference_tv);
    final CardView paidCard = convertView.findViewById(R.id.paid_cardview);
    final Switch paidSwitch = convertView.findViewById(R.id.paid_switch);

    debtor.setText(debtorArray.get(position));
    receiver.setText(receiverArray.get(position));
    difference.setText(String.valueOf(differenceArray.get(position) + "€"));

    fragment.load_switch_state();
    paidSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                // Set green background
                paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));

            }
            else{
                // Set blue background
                paidCard.setCardBackgroundColor(Color.parseColor("#FF3F51B5"));

            }
            fragment.save_switch_state(paidSwitch);
        }
    });
    return convertView;

Метод сохранения печатает "сохранено", но метод загрузки ничего не делает.Может быть, мне нужно передать позицию зрения?Это изображение приложения: enter image description here

report_list_view.xml содержит переключатель с идентификатором paid_switch report_fragment.xml содержит представление списка

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я решил проблему с этим кодом внутри моего адаптера:

public View getView(final int position, View convertView, ViewGroup parent) {

    SharedPreferences sharedPrefs = context.getSharedPreferences("sharedPrefs", Context.MODE_PRIVATE);
    final SharedPreferences.Editor editor = sharedPrefs.edit();
    convertView = inflater.inflate(R.layout.report_list_view, null);
    TextView debtor = convertView.findViewById(R.id.debtor_tv);
    TextView receiver = convertView.findViewById(R.id.receiver);
    TextView difference = convertView.findViewById(R.id.difference_tv);
    final CardView paidCard = convertView.findViewById(R.id.paid_cardview);
    final Switch paidSwitch = convertView.findViewById(R.id.paid_switch);

    debtor.setText(debtorArray.get(position));
    receiver.setText(receiverArray.get(position));
    difference.setText(String.valueOf(differenceArray.get(position) + "€"));

    paidSwitch.setChecked(sharedPrefs.getBoolean("CheckValue" + position, false));
    if (paidSwitch.isChecked()) {
        // Set green background
        paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
    }
    paidSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                // Set green background
                paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
                editor.putBoolean("CheckValue" + position, isChecked);
                editor.commit();

            } else {
                // Set blue background
                paidCard.setCardBackgroundColor(Color.parseColor("#FF3F51B5"));
                editor.putBoolean("CheckValue" + position, isChecked);
                editor.commit();

            }

        }
    });
    return convertView;
}

Теперь я сохраняю состояние своего коммутатора и после закрытия приложения оно корректно загружает последнее состояние с помощью sharedPreferences

0 голосов
/ 11 декабря 2018

Я не совсем понимаю, что вы вопрос.Но я думаю, что вы спрашиваете, что вы не хотите setChecked, если Switch не находится в макете.

, чтобы избежать вашей ошибки, сделайте это.

if(paidSwitch != null)
paidSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            // Set green background
            paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
        }
        else{
            // Set blue background
            paidCard.setCardBackgroundColor(Color.parseColor("#FF3F51B5"));
        }
        ((GroupDetailActivity)context).save_switch_state(paidSwitch);
    }
});

и внутри onCreate

    if(paidSwitch != null){
   paidSwitch.setChecked(sharedPreferences.getBoolean("switch_check", false));
    if (paidSwitch.isChecked()) {
        // Set green background
        paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
        }
    }

Мы добавляем здесь проверку, чтобы выполнить код только в том случае, если paidSwitch не имеет значения

Редактировать:

getActivity().getLayoutInflater().inflate(R.layout.report_list_view, null);
paidCard = childView.findViewById(R.id.paid_cardview);
paidSwitch = childView.findViewById(R.id.paid_switch);

не делайте этого.управлять этим внутри ArrayAdapter и notifyDatasetHasChanged

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