【问题标题】: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 中显示两次,但新添加的项目仅显示一次。 请帮我解决这些问题.. 提前谢谢..

【问题讨论】:

    标签: c# android xamarin save 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 中的重复项目,这样就不会显示两次项目。我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2018-07-06
    • 2014-03-03
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多