【问题标题】:Overriding value in resource with SharedPreference使用 SharedPreference 覆盖资源中的值
【发布时间】:2016-08-11 05:02:37
【问题描述】:

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

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

我的问题是我使用了迭代器、列表等,因此我使用了一些复杂的代码来对其进行排序。代码如下:

      // 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 个循环、一个计数器等?

任何帮助将不胜感激

谢谢

【问题讨论】:

标签: java android arrays sharedpreferences


【解决方案1】:

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

不包含重复元素的集合。更正式地说,集合 不包含元素对 e1 和 e2 使得 e1.equals(e2),并且在 最多一个空元素。正如它的名字所暗示的,这个接口模型 数学集合抽象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多