我正在寻找一种方法来隐藏Android微调框小部件中的一个项目.这将允许您模拟没有选择项目的微调器,并确保始终为所选的每个项目调用onItemSelected()回调(如果隐藏项目是"当前"项目).通常,微调器中总有一个项不会生成回调,即当前的回调.
stackoverflow上有一些关于如何禁用(灰显)项目的代码,而不是如何完全隐藏项目,就好像它们不存在一样.
经过多次实验,我想出了一个适用于各种新旧Android平台的黑客解决方案.它有一些小的化妆品缺点,很难注意到.我仍然希望听到一个更正式的解决方案,除了"不要用旋转器做那个".
这总是隐藏微调器中的第一个项目,但可以相当容易地扩展以隐藏任意项目或多个项目.在微调器项列表的开头添加一个包含空字符串的虚拟项.您可能希望在微调器对话框打开之前将当前微调器选择设置为项目0,这将模拟未选择的微调器.
使用ArrayAdapter方法的Spinner设置示例覆盖:
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; …Run Code Online (Sandbox Code Playgroud) 我有一个OnItemSelectedListenerfor my Spinner,但是当所选项目与前一个项目相同时,它不会被调用.显然,OnClickListener这不是一个选项Spinner.每次用户点击某个项目时我都需要抓住.任何的想法?
也许这Spinner是ActionBar扰乱正常行为的事实?
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.tracklist_menu, menu);
Spinner spinner = (Spinner) menu.findItem(R.id.option_ordering_spinner)
.getActionView();
spinner.setAdapter(mSpinnerAdapter);
spinner.setSelection(PrefsHelper.getOrderingSpinnerPos(prefs));
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
String str = "selected";
System.out.println(str);
if (optionMenuInitialized) {
switch (position) {
case 0:
// rdm
getActivity()
.sendBroadcast(
new Intent(
MyIntentAction.DO_RESHUFFLE_PLAYLIST));
smp.setCurrentTracklistCursorPos(-1);
trackAdapter.notifyDataSetChanged();
break;
case 1:
// artist
getActivity()
.sendBroadcast(
new Intent(
MyIntentAction.DO_ORDER_PLAYLIST_BY_ARTIST)); …Run Code Online (Sandbox Code Playgroud) android listener spinner actionbarsherlock android-actionbar
我试图让一个onClickListener在Spinner上触发,但是我收到以下错误:
Java.lang.RuntimeException是"不要为AdapterView调用setOnClickListener.你可能需要setOnItemClickListener,"
我确定我想调用onClickListener而不是onItemClickListener.我在Stack Overflow上找到了其他人提出的问题,有没有办法将setOnClickListener与Android Spinner一起使用?
答案说:
您必须在微调器的基础视图(通常是带有id:android.R.id.text1的TextView)上设置Click侦听器.为此:
创建自定义Spinner在构造函数(带属性)中通过提供布局android.R.layout.simple_spinner_item来创建微调器.执行findViewById(android.R.id.text1)以获取TextView现在将onClickListener设置为TextView
我已经尝试过那里提到的答案,但它似乎没有用.我在执行findViewById()后得到一个指向TextView的空指针.
这就是我正在做的事情:
Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.layoutspinner,dataArray);
spinner.setAdapter(adapter);
TextView SpinnerText = (TextView)findViewById(R.id.spinnerText);
if (SpinnerText == null) {
System.out.println("Not found");
}
else {
SpinnerText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//Do something
}
});
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinnerText"
android:singleLine ="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="6pt"
android:gravity="right"/>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我是Stack Overflow的新手,我没有找到任何办法向另一个帖子发布一个aditional问题(或评论,因为我需要很少代表)所以我开始了一个新问题.
每个推荐我试过这个:
int a = spinnerMes.getCount();
int b = spinnerMes.getChildCount();
System.out.println("Count = " + a); …Run Code Online (Sandbox Code Playgroud) 我有一个onItemSelected可以工作的Spinner ,但是Api规范如何说:
仅当新选择的位置与先前选择的位置不同或者没有选定的项目时,才会调用此回调.
我需要删除此限制,我希望如果用户选择相同的元素也调用回调.怎么做?我读了一个关于扩展Spinner类并设置位置的建议INVALID_POSITION,但我不明白/能够做到这一点.有人做过同样的事吗?
我想在微调器中选择相同的项目时触发事件.方法
@Override
public void onItemSelected(AdapterView<?> parent, View arg1, int position,
long arg3) {
}
Run Code Online (Sandbox Code Playgroud)
只有在我们做出不同的选择时才会被调用.我的目的是当选择任何项目时重新选择相同的项目或进行不同的选择时显示祝酒词.
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
Run Code Online (Sandbox Code Playgroud)
上面的方法并没有解决我的问题.
我有一个Spinner使用a填充SimpleCursorAdapter.我的光标有一些值,但我需要Spinner默认显示一个空选项.
出于某种原因ArrayAdapter<String>,我不想使用或CursorWrapper在此应用中使用.
应该有一种更简单的方法来Spinner默认显示一个空选项.
我在Android应用程序中使用微调控件,我通过onItemSelectedListener()方法处理用户选择.当与当前选项不同时,这似乎可以正常工作.我想在某些条件下将所有微调器重置为默认值并确保onItemSelectedListener()为所有调整器调用.
它是Android的语义的一部分,onItemSelectedListener()仅在用户选择更改时调用.有没有办法强制onItemSelectedListener()被召唤?
我有以下作为AppCompatSpinner条目:
<string-array name="startTimeList">
<item>Now</item>
<item>Pick a time..</item>
</string-array>
Run Code Online (Sandbox Code Playgroud)
选择后Pick a time..,TimePickerDialog打开a并允许用户选择时间.这是如何做:
startTimeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
// startTimeString = adapterView.getItemAtPosition(i).toString();
DateFormat currentDateFormat = new SimpleDateFormat("HH:mm:ss");
userAvailableTimeInSF = currentDateFormat.format(new Date());
final TextView startTimeSpinnerTV = (TextView) adapterView.getSelectedView();
startTimeSpinnerTV.setText(userAvailableTimeInSF);
switch (i) {
case 0:
userAvailableTimeInSF = currentDateFormat.format(new Date());
startTimeSpinnerTV.setText("Now");
break;
default:
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
TimePickerDialog timePickerDialog = new TimePickerDialog(PostSportRequest.this, …Run Code Online (Sandbox Code Playgroud) 我有一个带有onItemSelected交互的Spinner,但是Api规范如何说:
This callback is invoked only when the newly selected position is different from the
previously selected position or if there was no selected item.
Run Code Online (Sandbox Code Playgroud)
我需要删除此限制,我希望如果用户选择相同的元素也调用回调.怎么做?
有人做过同样的事吗?
对此有任何想法都会很明显..