16

我有一个具有交互作用的 Spinner onItemSelected,但是 Api 规范是如何说的:

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

我需要删除此限制,并且我希望在用户选择相同元素时也调用回调。怎么做?我阅读了有关扩展 Spinner 类并将位置设置为 的建议INVALID_POSITION,但我不理解/无法做到这一点。有人做过同样的事情吗?

4

6 回答 6

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

}

我希望这有帮助!

于 2014-04-10T14:12:04.150 回答
0

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

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

它可能适用于您的情况。

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

于 2011-11-21T13:18:09.267 回答
0

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

于 2013-11-21T09:44:57.767 回答
0

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

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

于 2013-11-28T16:07:27.523 回答
-1

使用 OnItemClickListener 而不是在 itemSelectedListener 上。这将适用于每次点击,无论它是相同的还是不同的。

于 2014-01-16T10:53:30.577 回答
-2

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

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

于 2011-11-21T13:21:00.583 回答