我正在寻找一种方法来隐藏一个项目在Android微调窗口小部件。这将允许您在没有选定项的情况下模拟微调器,并确保始终为选定的每个项调用onItemSelected()回调(如果隐藏项是“当前”项)。通常情况下,微调器中总有一项不会生成回调,即当前回调。
stackoverflow上有一些代码,说明了如何禁用(灰显)项,但没有说明如何完全隐藏项,就好像它们不存在一样。
经过多次试验,我想出了一个在各种新旧Android平台上都能工作的黑客解决方案。它有一些小的外观上的缺点,很难注意到。我仍然希望听到一个更正式的解决方案,而不是“不要用旋转器那样做”。
这总是隐藏微调器中的第一个项目,但可以很容易地扩展到隐藏任意项目或多个项目。在微调器项目列表的开头添加一个包含空字符串的虚拟项目。在微调器对话框打开之前,您可能希望将当前微调器选择设置为0项,这将模拟未选定的微调器。
使用ArrayAdapter方法覆盖的微调器设置示例:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
发布于 2013-03-02 00:52:49
要隐藏任意项或多个项,我认为您可以实现自己的适配器并设置要隐藏的索引(或索引的数组列表)。
public class CustomAdapter extends ArrayAdapter<String> {
private int hidingItemIndex;
public CustomAdapter(Context context, int textViewResourceId, String[] objects, int hidingItemIndex) {
super(context, textViewResourceId, objects);
this.hidingItemIndex = hidingItemIndex;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View v = null;
if (position == hidingItemIndex) {
TextView tv = new TextView(getContext());
tv.setVisibility(View.GONE);
v = tv;
} else {
v = super.getDropDownView(position, null, parent);
}
return v;
}
}
并在创建项目列表时使用自定义适配器。
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
int hidingItemIndex = 0;
CustomAdapter dataAdapter = new CustomAdapter(this, android.R.layout.simple_spinner_item, list, hidingItemIndex);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
(我还没有测试代码)希望这能有所帮助。
发布于 2014-02-03 04:23:10
通过截断列表可以更容易地隐藏列表末尾的项目。
但您必须首先选择它,以便它出现在微调器中,然后检查选择是否已更改为显示的项目之一。
List<String> list = new ArrayList<String>();
list.add("string1");
list.add("string2");
list.add("string3");
list.add("[Select one]");
final int listsize = list.size() - 1;
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list) {
@Override
public int getCount() {
return(listsize); // Truncate the list
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
mySpinner.setSelection(listsize); // Hidden item to appear in the spinner
发布于 2017-01-27 17:53:38
要隐藏微调器下拉列表中的任何项目,您需要根据所需的条件传递需要隐藏的项目的位置。我已经在隐藏从下拉列表中选择的项目的用例中实现了这一点
public class CustomAdapter extends ArrayAdapter<String> {
private List<String> dates;
private int hideItemPostion;
public CustomAdapter (Context context, int resource, List<String> dates) {
super(context, resource,dates);
this.dates=dates;
}
public void setItemToHide(int itemToHide)
{
this.hideItemPostion =itemToHide;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View v = null;
if (position == hideItemPostion) {
TextView tv = new TextView(getContext());
tv.setVisibility(View.GONE);
tv.setHeight(0);
v = tv;
v.setVisibility(View.GONE);
}
else
v = super.getDropDownView(position, null, parent);
return v;
}}
设置适配器的过程如下所示
final CustomAdapter dataAdapter = new CustomAdapter(this,R.layout.spinner_item,dates);
dataAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
dataAdapter.setItemToHide(0);
从下拉列表中选择一些项目时,位置也需要更改
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, final int i, long l) {
dataAdapter.notifyDataSetChanged();
mEPGDateSelector.setSelection(i);
dataAdapter.setItemToHide(i);}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
https://stackoverflow.com/questions/9863378
复制相似问题