Spinner onItemSelected已选择项目

问题描述 投票:14回答:6

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

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

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

android spinner android-spinner
6个回答
1
投票

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

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

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

我将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);
}

}

我希望这有帮助!


0
投票

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

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

它可能适合你的情况。

如果你有任何问题,请告诉我


0
投票

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


0
投票

这是具有自定义对话框模式且没有提示的微调器元素:

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

将默认值放在位置0的Array元素:

<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的第二个解决方案


-1
投票

使用OnItemClickListener而不是itemSelectedListener。无论是相同还是不同,它都适用于每次点击。


-2
投票

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

如果用户选择相同的元素,@ i想要调用回调。 Android会为你做这个,因为这是android的默认行为。

© www.soinside.com 2019 - 2024. All rights reserved.