如何在单击按钮上从微调器中删除所选项目?

Posted

技术标签:

【中文标题】如何在单击按钮上从微调器中删除所选项目?【英文标题】:How can I delete selected item from spinner on click button? 【发布时间】:2017-03-14 20:36:58 【问题描述】:

我正在开发一个 android 应用程序,我在 Xamarin、Visual stuio 中使用 c# 编写了这些代码:

const string KEY_FOR_TRY = "TRY";

ArrayAdapter<string> _spinnerAdapter;
List<string> items;

protected override void OnCreate (Bundle savedInstanceState)

    base.OnCreate (savedInstanceState);
    SetContentView (Resource.Layout.Main);

    string user;
    ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences (this);
        ISharedPreferencesEditor editor = prefs.Edit();
    var savedItems = prefs.GetStringSet (KEY_FOR_TRY, new List<string> ());
_spinnerAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, items);

 spinner.Adapter = _spinnerAdapter;

    items = new List<string> (savedItems) "1", "2", "3";

    Button button4 = FindViewById<Button> (Resource.Id.button4);
    Spinner spinner = FindViewById<Spinner> (Resource.Id.spinner1);
    EditText input = FindViewById<EditText> (Resource.Id.input);

    button4.Click += delegate
            
                user = input.Text;
                items.Add (user);
                editor.PutStringSet (KEY_FOR_TRY, items);
                editor.Apply ();
                _spinnerAdapter.Insert (user, 0);
                _spinnerAdapter.NotifyDataSetChanged ();
            ;
    user = items.FirstOrDefault ();

    _spinnerAdapter = new ArrayAdapter<string> (this, Android.Resource.Layout.SimpleSpinnerItem, items);

    spinner.Adapter = _spinnerAdapter;


Button button5 = FindViewById<Button>(Resource.Id.button5);
        button5.Click += delegate
        
            items.Remove(spinner.SelectedItem.ToString());
            editor.Remove(spinner.SelectedItem.ToString());
            editor.Apply();
            _spinnerAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, items);
            spinner.Adapter = _spinnerAdapter;
        ;
        user = items.FirstOrDefault();
        spinner.Adapter = _spinnerAdapter;

我想要一个button5,它从spinnerSharedPreference prefs 中删除用户选择的项目。此外,当我运行这些代码时,var items 中的每个项目在微调器中显示两次,我该如何停止呢?并且 (button4) 如果用户输入了两次相同的值,我想显示一个 toast message 表示您已经输入了这个值。

编辑: button5 从微调器中删除该项目并且不会永久删除它,因此当我关闭并重新打开应用程序时,已删除的项目重新出现在微调器中。此外,var items 中的每个项目在spinner 中显示两次,但新添加的项目仅显示一次。 请帮我解决这些问题.. 提前谢谢..

【问题讨论】:

【参考方案1】:

在 OnCreate 方法之外声明您的项目列表。

List<string> items;


protected override void OnCreate (Bundle savedInstanceState)

    base.OnCreate (savedInstanceState);
    SetContentView (Resource.Layout.Main);
    ....

    items = new List<string> (savedItems) "1", "2", "3";
    _spinnerAdapter = new ArrayAdapter<string> (this, Android.Resource.Layout.SimpleSpinnerItem, items);
    spinner.Adapter = _spinnerAdapter;    

    button5.Click += delegate 
         // To remove the selected item, first remove the selected item from the list, then call NotifyDataSetChanged
         items.remove(spinner.SelectedItem.ToString ());
         _spinnerAdapter.NotifyDataSetChanged ();
    ;


至于,项目在微调器中显示两次

var savedItems = prefs.GetStringSet (KEY_FOR_TRY, new List<string> ());
var items = new List<string> (savedItems) "1", "2", "3";

你这样做对吗?您的列表现在包含集合 savedItems + "1", "2", "3"

编辑:

对不起,我错了。使用微调器“NotifyDataSetChanged()”似乎不起作用。您需要重新设置适配器。

public class MainActivity : Activity

    Spinner mySpinner;
    Button button;

    List<string> items;
    ArrayAdapter<string> _spinnerAdapter;

    protected override void OnCreate (Bundle savedInstanceState)
    
        base.OnCreate (savedInstanceState);

        SetContentView (Resource.Layout.Main);

        button = FindViewById<Button> (Resource.Id.myButton);
        mySpinner = FindViewById<Spinner> (Resource.Id.mySpinner);

        items = new List<string>  "1", "2", "3" ;

        _spinnerAdapter = new ArrayAdapter<string> (this, Android.Resource.Layout.SimpleSpinnerItem, items);
        mySpinner.Adapter = _spinnerAdapter;

        button.Click += delegate 
            items.Remove (mySpinner.SelectedItem.ToString ());
            mySpinner.Adapter = new ArrayAdapter<string> (this, Android.Resource.Layout.SimpleSpinnerItem, items);
        ;
    

这行得通。我已经测试过了。

编辑:

替换

 editor.Remove(spinner.SelectedItem.ToString());

与:

 editor.PutStringSet (KEY_FOR_TRY, items);
 editor.Apply ();

您正在尝试从 SharedPreference 中删除微调器中的选定项目,而选定项目位于 SharedPreference 内部的列表中。

【讨论】:

我应该把这两行代码放在哪里来停止显示两次?至于从微调器中删除项目,我没有工作。 我认为集合 savedItems 已经包含 "1", "2", "3"。 var items = new List (savedItems);这将摆脱我认为的重复 好的,这很好,但出现了一个问题。这不再保存用户输入。如果我在items = new List&lt;string&gt; 之后添加(saveditems),这将显示项目两次,但会保存用户输入。此外,当从微调器中删除项目然后重新打开应用程序时,该项目会重新出现。我希望永久删除该项目。 从共享偏好中删除项目以及在按钮点击内 我想过,但我不知道为什么它不起作用。我在想是否可以删除 _spinnerAdapter 中的重复项目,这样就不会显示两次项目。我该怎么做?

以上是关于如何在单击按钮上从微调器中删除所选项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何从该片段中的 onItemSelectedListener 中获取微调器单击的项目?

如何在我的微调器中使用 getItemAtPosition 从谷歌地图中的火力基地使用 android studio

以编程方式设置微调器的选定项

在 ext js 中的按钮单击事件上从网格和数据库中删除记录

如何从微调器中检索数据并进行处理?

获取微调器选定项目文本?