Spinner onItemSelected已选择项目

时间:2011-11-21 13:11:57

标签: android spinner android-spinner

我有一个onItemSelected交互的Spinner有效,但Api规范如何说明:

  

仅当新选择的位置为时,才会调用此回调   与先前选择的位置不同或者如果没有   选定的项目。

我需要删除此限制,并且我希望如果用户选择相同的元素也会调用回调。 怎么做?我阅读了关于扩展Spinner类并将位置设置为INVALID_POSITION的建议,但我不明白/能够做到这一点。 有人做过同样的事吗?

6 个答案:

答案 0 :(得分:1)

我还需要一个解决这个问题的方法。我想要做的是拥有一个具有自定义范围选项的日期范围的Spinner。行看起来像这样:

4月10日 - 5月10日 3月10日 - 4月10日 2月10日 - 3月10日 自定义范围

问题是,如果用户选择自定义范围然后想要更改其自定义范围,则必须选择不同的范围,然后再次选择自定义范围选项。我希望用户能够再次选择“自定义范围”,以便再次显示自定义范围对话框。

我将Spinner分类并创建了自己的听众。代码切换选择,但随后立即切换它以便不选择任何内容。在我的倾听者中,我只是忽略任何小于零的位置。

Spinner只显示最后选择的项目。我创建了自己的自定义适配器并指定每个视图显示的内容,但这不是必需的。以下是我对Spinner的分类。

package com.example.widget;

import android.content.Context;
import android.widget.Spinner;

public class DateRangeSpinner extends Spinner {

private ItemSelectionListener listener;

public DateRangeSpinner(Context context) {
    super(context);
}

/**
 * This listener will be fired every time an item is selected,
 * regardless of whether it has already been selected or not.
 * 
 * @param l
 */
public void setOnItemSelectedListener(ItemSelectionListener l) {
    listener = l;
}

public void removeOnItemSelectedListener() {
    listener = null;
}

@Override
public void setSelection(int position) {
    setSelection(position, true);
}

@Override
public void setSelection(int position, boolean animate) {
    if (listener != null) {
        listener.onItemSelected(position);
    }
    super.setSelection(position, animate);
    super.setSelection(-1, animate);
}   

public interface ItemSelectionListener {
    public void onItemSelected(int position);
}

}

我希望这有帮助!

答案 1 :(得分:0)

您可以通过自定义适配器执行此操作,例如创建所需视图的布局,然后在自定义适配器中对此进行充气,然后在onItemClick函数上通过此函数获取视图。

要区分每个视图,您必须设置每行的标记。

它可能适合你的情况。

如果您有

,请告诉我任何问题

答案 2 :(得分:0)

为什么您再次选择所选项目。如果您想再次执行该任务,只需提供一个刷新按钮。

答案 3 :(得分:0)

这是具有自定义对话框模式和whitout promt的微调器元素:

<Spinner
    android:id="@+id/spinner_metatag"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:entries="@array/search_adv" 
/>

将默认值放在第0位的数组元素:

<string-array name="search_adv">
    <item>@string/search_adv_prompt</item>
    <item>@string/search_adv_title</item>
    <item>@string/search_adv_desc</item>
    <item>@string/search_adv_autore</item>
    ....
</string-array>

具有默认值的数组的String元素:

<string name="search_adv_prompt">Scegli un metatag</string> <!-- Default value-->
<string name="search_adv_title">Titolo</string> 
<string name="search_adv_desc">Descrizione</string> 
<string name="search_adv_autore">Autore</string>
...

这里是防止在onCreateMethod上触发事件的代码,以及允许选择已经选择的同一元素的解决方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_adv_main);

    spinner = (Spinner) findViewById(R.id.spinner_metatag);

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
            //prevent onCreate event fire and the loop
            if(pos==0)
                return;

            //HERE YOUR CODE

            //at the end move to the default element the spinner
            spinner.setSelection(0);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {}
    });
}

希望有所帮助。这个想法来自TreKing's answer

的第二个解决方案

答案 4 :(得分:-1)

使用OnItemClickListener而不是itemSelectedListener。这对每次点击都有效。无论是相同还是不同。

答案 5 :(得分:-2)

我猜你必须将值存储在变量中,用-1初始化vairable。并在用户选择项目微调器时更改值,如果值为-1则要求用户重新选择或任何您想要的内容。

@i希望在用户选择相同元素时也调用回调。 Android会为你做这个,因为这是android的默认行为。