首先,我很抱歉这个问题不合适。
我正在我的Android应用程序中实现一个国家/地区选择器功能,我找到了一个github项目,这对我来说是一个好的开始。该代码可以正常运行,并且符合预期。
我首先将其分解以了解其工作原理。
这是代码的模糊部分
@Override
protected ArrayList<Country> doInBackground(Void... params) {
ArrayList<Country> data = new ArrayList<Country>(233);
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(mContext.getApplicationContext().getAssets().open("countries.dat"), "UTF-8"));
// do reading, usually loop until end of file reading
String line;
int i = 0;
while ((line = reader.readLine()) != null) {
//process line
Country c = new Country(mContext, line, i);
data.add(c);
ArrayList<Country> list = mCountriesMap.get(c.getCountryCode());
if (list == null) {
list = new ArrayList<Country>();
mCountriesMap.put(c.getCountryCode(), list);
}
list.add(c);
i++;
}
} catch (IOException e) {
//log the exception
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
//log the exception
}
}
}
//this code enables app to pick the right default country from the spinner
String countryRegion = PhoneUtils.getCountryRegionFromPhone(mContext);
int code = mPhoneNumberUtil.getCountryCodeForRegion(countryRegion);
final ArrayList<Country> list = mCountriesMap.get(code);
/*getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < list.size(); i++)
Toast.makeText(mContext, "ds: " + list.get(i).getName(), Toast.LENGTH_SHORT).show();
}
});*/
if (list != null) {
for (Country c : list) {
if (c.getPriority() == 0 || c.getPriority() == 1) {
mSpinnerPosition = c.getNum();
break;
}
}
}
return data;
}
此代码读取asset
文件夹中的文件并将对象添加到列表中。
之后,它会选择设备的国家/地区,然后从所有国家/地区的微调器中选择它
在while
循环中,我认为list.add(c);
这行是没有意义的,因为while循环将再次循环并创建新的列表对象。如果我对此行发表评论,即使mCountriesMap.get(code)
不为空,mCountriesMap
也会返回空列表。
所以我的问题是为什么会发生这种现象? list.add(c);
在这里做什么?
答案 0 :(得分:1)
要考虑的重要部分是
mCountriesMap.put(c.getCountryCode(), list);
这会将新创建的列表添加到mCountriesMap
,因此,即使它在循环中每次迭代都创建了一个新列表,仍可以通过地图访问以前创建的列表。
答案 1 :(得分:1)
想象有3个国家/地区代码{US,US,AU}.
因此,运行此命令会导致
mCountriesMap{
US: List{US,US}
AU: List{AU}
}
我认为您的疑问是list.add(c);
之后的mCountriesMap.put(c.getCountryCode(), list);
我将尝试逐步解释
第一种情况
ArrayList<Country> list = mCountriesMap.get(US); //No value in mCountriesMap
if (list == null) { //list is null so true
list = new ArrayList<Country>();
mCountriesMap.put(US, list); //mCountriesMap{US: List{} }
}
list.add(US); //mCountriesMap{US: List{US} } here hashmap will get updated
第二种情况
ArrayList<Country> list = mCountriesMap.get(US); //get the prevous list
if (list == null) { //list have value so false
list = new ArrayList<Country>();
mCountriesMap.put(US, list); //mCountriesMap{US: List{US} }
}
list.add(US); //mCountriesMap{US: List{US,US} } here hashmap will get updated
第3个只是第一种情况的重复。