在AlertDialog中设置新值后更新ListView?

时间:2017-10-31 08:26:22

标签: android listview

在将其保存在sharedPreferences中后,我在ListView中设置新值时遇到问题。

The two lines - ListView with Items

在图片上,您可以看到我在智能手机屏幕上看到的内容(更容易为我描述)。如果我现在按下项目“Korrektur-Faktor”,则会打开一个AlertDialog,我可以设置一个新值。

The AlertDialog

如果我现在按保存,新值(80)将保存在SharedPreferences中,但我的ListViewItem的第二行中的值不会自动更新。

这里有一些代码:

    String secLineCorrect = correctvalue.toString();
    ValueSettings targetValue = new ValueSettings("Zielwert", "getTargetSharedPref"); //TODO
    ValueSettings correctFactor = new ValueSettings("Korrektur-Faktor", secLineCorrect + " mg/dl pro 1IE");

    //Füllen der ListView
    final ArrayList<ValueSettings> valuesSettingsList = new ArrayList<>();
    valuesSettingsList.add(targetValue);
    valuesSettingsList.add(correctFactor);

    final ValueSettingsListAdapter valuesSettingsAdapter = new ValueSettingsListAdapter(this, R.layout.settings_list_item_two_lines, valuesSettingsList);
    lvValues.setAdapter(valuesSettingsAdapter);

    //Klickbare Items
    lvValues.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            switch(position){
                    //First Item in List
                case 0:
                    Toast.makeText(SettingsActivity.this, "You clicked on: " + valuesSettingsList.get(position).getFirstLine() +  "mit Item Nummer" + position, Toast.LENGTH_SHORT).show();
                    break;

                    //Second Item in List
                case 1:
                    AlertDialog.Builder mBuilder = new AlertDialog.Builder(SettingsActivity.this);
                    View mView = getLayoutInflater().inflate(R.layout.dialog_correctfactor,null);
                    final EditText mCorrectFactor = (EditText) mView.findViewById(R.id.et_correct_factor_input);
                    Button mCancel = (Button) mView.findViewById(R.id.btn_cancel);
                    Button mSave = (Button) mView.findViewById(R.id.btn_save);

                    mBuilder.setView(mView);
                    final AlertDialog dialog = mBuilder.create();
                    dialog.show();

                    //Click on Cancel
                    mCancel.setOnClickListener(new View.OnClickListener(){
                        @Override
                        public void onClick(View v){
                            Toast.makeText(SettingsActivity.this, "Abgebrochen. Kein neuer Wert eingespeichert!", Toast.LENGTH_SHORT).show();
                        }
                    });
                    //Click on Save
                    mSave.setOnClickListener(new View.OnClickListener(){
                        @Override
                        public void onClick(View v) {
                            if(mCorrectFactor.getText().length() > 0){
                                correctvalue = Integer.parseInt(mCorrectFactor.getText().toString());
                                editor.putInt(correctValueKEY, correctvalue);
                                editor.commit();
                                Toast.makeText(getApplicationContext(), "1 IE entspricht " + correctvalue + " mg/dl.", Toast.LENGTH_SHORT).show();
                            }else {
                                Toast.makeText(getApplicationContext(), "Wert ist auf " + correctvalue + " md/dl gesetzt. Keine Änderung vorgenommen.", Toast.LENGTH_LONG).show();
                            }
                            dialog.cancel();
                        }
                    });


                    break;

            }
        }
    });

如您所见,我在代码的开头设置了文本。因此,每当我想要显示之前保存的新值时,我必须返回到我的主要活动并启动设置 - 活动新。但是现在我希望在我按下save并关闭AlertDialog之后,会显示新值。我尝试了很多,但从来没有得到解决方案。 愿有人可以帮助我:)

2 个答案:

答案 0 :(得分:1)

首先,您应确保保存的值反映在valuesSettingsList中,如woodii所示。

您可以在保存新值后添加此行:

valuesSettingsAdapter.notifyDataSetChanged();

答案 1 :(得分:1)

对于此类功能,我可以建议PreferenceFragmentPreferenceActivity。 无论如何,您可以使用SharedPreferences.OnSharedPreferenceChangeListener并覆盖方法onSharedPreferenceChanged并相应地更新列表中的条目。

目前,您只更改SharedPreferences中的存储值,而不更改列表中的可见值。