使用SharedPreference

时间:2016-04-19 07:20:25

标签: java android arrays sharedpreferences

我正在试图弄清楚是否有一种简单的方法来实现我正在做的事情。基本上我在Strings.xml中有一些关于某些城市的预定义值。但是用户可以选择更改它我的“m”在内部存储为SharedPReferences(实质上是覆盖资源值)。

首先,我认为这是正确的方法之一。我想保持我的实现简单,因为我知道如何做到这一点,让我们假设这是一种可接受的方法(如果没有,请提供一些关于这样做的建议 - 但这不是我正在看的)。 / p>

我的问题是我使用了Iterator,List等,因此我使用了一些有问题的代码来对它进行排序。代码如下:

      // Get our predefined cities from our resources file
    String [] predefinedCities = res.getStringArray(R.array.predefined_cities);
    ArrayList<String> predefinedCitiesMinusOverridden = new ArrayList<String >();

    // Add values from our custom cities onto the Adapter via SharedPreferences
    prefs = getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE);
    Iterator<String> userCities = readCitiesFromPref();

     // Start of sort operation - to show these in alphabetical order
    List<String> copyOfUserCities = new ArrayList<String>();
    while (userCities.hasNext()){

        copyOfUserCities.add(userCities.next());

    }

    /* Code start to override resource value, i.e. remove resource value if
       our SharedPreferences contain the city. This means user has over-ridden values
     */

    int preDefCounter = 0;

    for(int i=0; i<predefinedCities.length; i++){ // for each city in predefined city

        boolean duplicateFound = false;

        for(int j=0; j<copyOfUserCities.size(); j++) { // check if there is match in user defined value

            if(predefinedCities[i].toString().equals(copyOfUserCities.get(j).toString())){

                duplicateFound = true; // Set that the string is found
                break; // NO need to continue checking this further

            }

        }

        // Here we finally find out whether to retain our preDefined city or not
        if(!duplicateFound){

            predefinedCitiesMinusOverridden.add(preDefCounter, predefinedCities[i]); // Retain it as new String
            preDefCounter++; // increment counter for our String Array

        }
    }

 /* End Code to remove duplicate values
     */

    ArrayList<String> sortedCities = new ArrayList<String>();
    sortedCities.addAll(copyOfUserCities);
    sortedCities.addAll(predefinedCitiesMinusOverridden);
    Collections.sort(sortedCities);
    sortedCities.add(0, "No City Selected"); // First selection should be "No City Selected"

    //End sort operation

    ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
            this,
            android.R.layout.simple_spinner_item,
            sortedCities);

有没有更简单的方法来做这个而不是使用2个数组,2个循环,一个计数器等?

非常感谢任何帮助

由于

1 个答案:

答案 0 :(得分:0)

您可以使用一个Set对象而不是两个ArrayList个对象。您对Set集合类型有类似的操作但行为不同。

  

不包含重复元素的集合。更正式的,集合   不包含元素e1和e2对,使得e1.equals(e2)和at   大多数一个null元素。正如其名称所暗示的,这个界面模型   数学集抽象。