在 android Spinner 中实现键值对的最佳实践
Best practice to implement key-value pair in android Spinner
我想实现一个 android 键值为 的微调器。
en:english jp:japanese
当用户 select 和项目时,我想将密钥保存到数据库中。而且在下一次加载时,我希望微调器到 select 微粒微调器位置。
任何人都可以告诉我实现它的最佳方法是什么。
我已尝试关注但不符合我的要求
https://gist.github.com/granoeste/2786663
Set Key and Value in spinner
现在写我正在使用LinkedHashMapAdapter。但问题是,在这里我需要将位置存储在数据库或本地共享首选项中。我认为这不是更好的解决方案
当前实施
LinkedHashMap localeList = new LinkedHashMap<>();
for (Map.Entry<String, String> val : map.entrySet()) {
int resourceId = getResources().getIdentifier(val.getValue(), "string", getPackageName());
localeList.put(val.getKey(), getResources().getString(resourceId));
}
LinkedHashMapAdapter<String, String> arrayAdapter = new LinkedHashMapAdapter<>(this, R.layout.spinner_layout, localeList);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mLocale.setAdapter(arrayAdapter);
String localPosSelected = PreferencesHelper.getSharedPreferenceString(this, Constants.PREF_LOCALE_POS_KEY);
if(localPosSelected!=null){
mLocale.setSelection(Integer.parseInt(localPosSelected));
}
还有一个选项可以按值select编辑 Spinner 的项目
您可以在数据库中保存选定的 spinner
项目位置,下次根据保存的位置设置 spinner
项目
获得位置:
int position = spinner1.getSelectedItemPosition();
设置:
spinner.setSelection(position);
注意在设置spinner
adapter
后调用setSelection()
方法
您可以创建 custom adapter for spinner 来实现这一点。
使用自定义适配器
- 您将能够使用您的
hashMap
作为键值对。
- 您可以通过您的自定义视图进行更改。
我使用 HashMap adapter for use in these scenarios. Also see example project here
创建
mapData = new LinkedHashMap<String, String>();
mapData.put("shamu", "Nexus 6");
mapData.put("fugu", "Nexus Player");
mapData.put("volantisg", "Nexus 9 (LTE)");
mapData.put("volantis", "Nexus 9 (Wi-Fi)");
mapData.put("hammerhead", "Nexus 5 (GSM/LTE)");
mapData.put("razor", "Nexus 7 [2013] (Wi-Fi)");
mapData.put("razorg", "Nexus 7 [2013] (Mobile)");
mapData.put("mantaray", "Nexus 10");
mapData.put("occam", "Nexus 4");
mapData.put("nakasi", "Nexus 7 (Wi-Fi)");
mapData.put("nakasig", "Nexus 7 (Mobile)");
mapData.put("tungsten", "Nexus Q");
adapter = new LinkedHashMapAdapter<String, String>(this, android.R.layout.simple_spinner_item, mapData);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
设置微调器:
spLang = (Spinner)view.findViewById( R.id.spLang );
spLang.setOnItemSelectedListener( this );
ArrayList<String> sp_Lang = new ArrayList<String>();
sp_Lang.add("english");
sp_Lang.add("french");
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, sp_Lang);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spLang.setAdapter(spinnerAdapter);
对于 Perticular Spinner 项目选择:
int Position = spinnerAdapter.getPosition("Japanese");
spLang.setSelection(Position);
首先为存储键值对创建 Hashmap
HashMap<String ,String> hmLang = new HashMap<String,String>();
现在将这样的值添加到 HashMap 中:
hmLang.put("english" ,"en");
在 HashMap 中 key = YourValue 和 Value = yourKey
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
switch(adapterView.getId())
{
case R.id.spLang:
String lang_Name = adapterView.getItemAtPosition(position).toString();
String lang_Key = hmLang.get(lang_Name);
break
}
如果您对此代码有任何疑问,请询问
Populate Spinner
void populateRecordPerPageSpinner(LinkedTreeMap<String, String> map) {
String selectedValue = PreferencesHelper.getSharedPreferenceString(context, Constants.PREF_RECORD_PER_PAGE_KEY);
List<String> recordPerPageList = new ArrayList();
for (Map.Entry<String, String> val : map.entrySet()) {
int resourceId = getResources().getIdentifier(val.getValue(), "string", getPackageName());
recordPerPageMap.put(val.getKey(), getResources().getString(resourceId));
recordPerPageList.add(getResources().getString(resourceId));
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, R.layout.spinner_layout, recordPerPageList);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mRecordPerPage.setAdapter(arrayAdapter);
mRecordPerPage.setSelection(arrayAdapter.getPosition(selectedValue));
}
Fetch and save position in preference
selectedRecPerPage = recordPerPageMap.get(mRecordPerPage.getAdapter().getItem(recordPerPagePosition));
PreferencesHelper.setSharedPreferenceString(context, Constants.PREF_RECORD_PER_PAGE_KEY, selectedRecPerPage);
我更新了 Dhaval 的 答案,使其更通用。此解决方案利用 toString()
和 ArrayAdapter
(您无需使用所有逻辑实现您自己的适配器)并在 Kotlin
中实现
创建您的自定义 class 并覆盖 toString()
方法。
data class SpinnerEntry(
// define whatever properties you want
val label: String,
val key: MyEnum,
) {
override fun toString(): String {
return label // this will display to user
}
}
初始化微调器
val entries = listOf(
// you want to extract string resources to XML
SpinnerEntry("LabelA", MyEnum.A),
SpinnerEntry("LabelB", MyEnum.B),
SpinnerEntry("LabelC", MyEnum.C),
SpinnerEntry("LabelD", MyEnum.D),
)
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
val selectedItem = parent?.getItemAtPosition(position) as SpinnerEntry
val key = selectedItem.key
// do something with selected key
}
override fun onNothingSelected(parent: AdapterView<*>?) {
// do something when unselected
}
}
val spinnerAdapter: ArrayAdapter<SpinnerEntry> = ArrayAdapter(
applicationContext!!, // get context depending on your implementation
android.R.layout.simple_spinner_item,
entries
)
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = spinnerAdapter
我想实现一个 android 键值为 的微调器。
en:english jp:japanese
当用户 select 和项目时,我想将密钥保存到数据库中。而且在下一次加载时,我希望微调器到 select 微粒微调器位置。
任何人都可以告诉我实现它的最佳方法是什么。
我已尝试关注但不符合我的要求 https://gist.github.com/granoeste/2786663 Set Key and Value in spinner
现在写我正在使用LinkedHashMapAdapter。但问题是,在这里我需要将位置存储在数据库或本地共享首选项中。我认为这不是更好的解决方案
当前实施
LinkedHashMap localeList = new LinkedHashMap<>();
for (Map.Entry<String, String> val : map.entrySet()) {
int resourceId = getResources().getIdentifier(val.getValue(), "string", getPackageName());
localeList.put(val.getKey(), getResources().getString(resourceId));
}
LinkedHashMapAdapter<String, String> arrayAdapter = new LinkedHashMapAdapter<>(this, R.layout.spinner_layout, localeList);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mLocale.setAdapter(arrayAdapter);
String localPosSelected = PreferencesHelper.getSharedPreferenceString(this, Constants.PREF_LOCALE_POS_KEY);
if(localPosSelected!=null){
mLocale.setSelection(Integer.parseInt(localPosSelected));
}
还有一个选项可以按值select编辑 Spinner 的项目
您可以在数据库中保存选定的 spinner
项目位置,下次根据保存的位置设置 spinner
项目
获得位置:
int position = spinner1.getSelectedItemPosition();
设置:
spinner.setSelection(position);
注意在设置spinner
adapter
setSelection()
方法
您可以创建 custom adapter for spinner 来实现这一点。
使用自定义适配器
- 您将能够使用您的
hashMap
作为键值对。 - 您可以通过您的自定义视图进行更改。
我使用 HashMap adapter for use in these scenarios. Also see example project here
创建 mapData = new LinkedHashMap<String, String>();
mapData.put("shamu", "Nexus 6");
mapData.put("fugu", "Nexus Player");
mapData.put("volantisg", "Nexus 9 (LTE)");
mapData.put("volantis", "Nexus 9 (Wi-Fi)");
mapData.put("hammerhead", "Nexus 5 (GSM/LTE)");
mapData.put("razor", "Nexus 7 [2013] (Wi-Fi)");
mapData.put("razorg", "Nexus 7 [2013] (Mobile)");
mapData.put("mantaray", "Nexus 10");
mapData.put("occam", "Nexus 4");
mapData.put("nakasi", "Nexus 7 (Wi-Fi)");
mapData.put("nakasig", "Nexus 7 (Mobile)");
mapData.put("tungsten", "Nexus Q");
adapter = new LinkedHashMapAdapter<String, String>(this, android.R.layout.simple_spinner_item, mapData);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
设置微调器:
spLang = (Spinner)view.findViewById( R.id.spLang );
spLang.setOnItemSelectedListener( this );
ArrayList<String> sp_Lang = new ArrayList<String>();
sp_Lang.add("english");
sp_Lang.add("french");
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, sp_Lang);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spLang.setAdapter(spinnerAdapter);
对于 Perticular Spinner 项目选择:
int Position = spinnerAdapter.getPosition("Japanese");
spLang.setSelection(Position);
首先为存储键值对创建 Hashmap
HashMap<String ,String> hmLang = new HashMap<String,String>();
现在将这样的值添加到 HashMap 中:
hmLang.put("english" ,"en");
在 HashMap 中 key = YourValue 和 Value = yourKey
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
switch(adapterView.getId())
{
case R.id.spLang:
String lang_Name = adapterView.getItemAtPosition(position).toString();
String lang_Key = hmLang.get(lang_Name);
break
}
如果您对此代码有任何疑问,请询问
Populate Spinner
void populateRecordPerPageSpinner(LinkedTreeMap<String, String> map) {
String selectedValue = PreferencesHelper.getSharedPreferenceString(context, Constants.PREF_RECORD_PER_PAGE_KEY);
List<String> recordPerPageList = new ArrayList();
for (Map.Entry<String, String> val : map.entrySet()) {
int resourceId = getResources().getIdentifier(val.getValue(), "string", getPackageName());
recordPerPageMap.put(val.getKey(), getResources().getString(resourceId));
recordPerPageList.add(getResources().getString(resourceId));
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, R.layout.spinner_layout, recordPerPageList);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mRecordPerPage.setAdapter(arrayAdapter);
mRecordPerPage.setSelection(arrayAdapter.getPosition(selectedValue));
}
Fetch and save position in preference
selectedRecPerPage = recordPerPageMap.get(mRecordPerPage.getAdapter().getItem(recordPerPagePosition));
PreferencesHelper.setSharedPreferenceString(context, Constants.PREF_RECORD_PER_PAGE_KEY, selectedRecPerPage);
我更新了 Dhaval 的 答案,使其更通用。此解决方案利用 toString()
和 ArrayAdapter
(您无需使用所有逻辑实现您自己的适配器)并在 Kotlin
创建您的自定义 class 并覆盖 toString()
方法。
data class SpinnerEntry(
// define whatever properties you want
val label: String,
val key: MyEnum,
) {
override fun toString(): String {
return label // this will display to user
}
}
初始化微调器
val entries = listOf(
// you want to extract string resources to XML
SpinnerEntry("LabelA", MyEnum.A),
SpinnerEntry("LabelB", MyEnum.B),
SpinnerEntry("LabelC", MyEnum.C),
SpinnerEntry("LabelD", MyEnum.D),
)
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
val selectedItem = parent?.getItemAtPosition(position) as SpinnerEntry
val key = selectedItem.key
// do something with selected key
}
override fun onNothingSelected(parent: AdapterView<*>?) {
// do something when unselected
}
}
val spinnerAdapter: ArrayAdapter<SpinnerEntry> = ArrayAdapter(
applicationContext!!, // get context depending on your implementation
android.R.layout.simple_spinner_item,
entries
)
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = spinnerAdapter