【问题标题】:How to maintain spinner state in android如何在android中保持微调器状态
【发布时间】:2013-04-27 20:04:39
【问题描述】:

我正在做一个 Android 应用程序,它可以从网络服务获取数据并将其加载到微调器中。当我转到某个屏幕并返回时,我需要保持微调器的选定数据状态。例如,如果我以1.apple 2.orange 3.grapes 的形式从Web 服务获取数据并将其加载到微调器中,那么我选择orange。当我转到其他屏幕并返回时,选定的微调器数据应为orange。但它再次将数据从服务器加载到微调器中。谁能帮我解决这个问题?

我的代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //...

    if (Constants.SPINNER != null ) {
        spinner.setSelection( Constants.SPINNER);
    } else {
        //WebCall here for getting data
    }

    //...

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent,
            View view, int arg2, long arg3) {
                Constants.SPINNER = spinner.getSelectedItemPosition();

Constant 类中:

public static Integer SPINNER="";

【问题讨论】:

  • 您尝试过什么?发布一些您尝试过的代码以获得更好的答案....
  • 您要存储选定的微调器..

标签: android android-spinner


【解决方案1】:

你可以使用

  spinner.getSelectedItemPosition(); 

这将返回给您一个 int,您可以用它保存

  prefEdit.putInt(); 

然后,当您想重新加载已保存的所有内容时,您只需调用

  spinner.setSelection(prefs.getInt("key", default));

或像这样尝试

保存:

  int selectedPosition = yourSpinner.getSelectedItemPosition()
  editor.putInt("spinnerSelection", selectedPosition);
  editor.commit();

加载:

yourSpinner.setSelection(prefs.getInt("spinnerSelection",0));

如果你是数组使用它应该像这样改变

 String selectedString = yourArray[yourSpinner.getSelectedItemPosition()];
   editor.putString("spinnerSelection", selectedString);
   editor.commit();

根据 prefs 中存储的值检查 array[i]。如果您使用 ArrayList 而不是这部分可以通过调用在没有循环的情况下完成

 ArrayList.indexOf(prefs.getString("spinnerSelection", "");

当您提交时,显示所有上述数组项都消失了。在数组中显示没有人。

【讨论】:

  • 而且每当您导航到下一个屏幕时,还要发送带有所选项目的微调器数据作为额外的意图。(以避免一次又一次地调用服务)。并在您的第一个活动中检查数据是否存在于额外的意图中,如果不存在则仅调用服务
【解决方案2】:

您可以按照以下步骤操作:

您需要保存微调器的状态,以便对您有所帮助。

1.) 在创建微调器对象后应用它

sectionNameSpinner.setSelection(getPersistedItem());

2.) 根据您创建这些方法以保存微调器所选项目的状态

private int getPersistedItem() {
        String keyName = makePersistedItemKeyName();
        return PreferenceManager.getDefaultSharedPreferences(this).getInt(keyName, 0);
    }

    protected void setPersistedItem(int position) {
        String keyName = makePersistedItemKeyName();
        PreferenceManager.getDefaultSharedPreferences(this).edit().putInt(keyName, position).commit();
    }

    private String makePersistedItemKeyName() {
        return currentUserName + "_your_key";
    }

3.) 在微调器选择更改时设置其状态:

sectionNameSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parentView, View view, int position, long itemId) {

                setPersistedItem(position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });

【讨论】:

    【解决方案3】:

    当您“转到其他屏幕”时,您应该通过一个新活动来执行此操作。然后,在您完成该新活动后,微调器选择活动将恢复,并且选择状态将与开始第二个活动之前一样。

    【讨论】:

      【解决方案4】:
      • 确保您没有在活动的 OnResume() 中点击网络服务。
      • 在继续下一个活动之前,通过调用 finish() 确保您没有完成当前活动。
      • 并在网络命中前检查数据是否可用(这里可以避免不必要的网络命中)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多