我有一个onItemSelected
交互的Spinner有效,但Api规范如何说明:
仅当新选择的位置为时,才会调用此回调 与先前选择的位置不同或者如果没有 选定的项目。
我需要删除此限制,并且我希望如果用户选择相同的元素也会调用回调。
怎么做?我阅读了关于扩展Spinner类并将位置设置为INVALID_POSITION
的建议,但我不明白/能够做到这一点。
有人做过同样的事吗?
答案 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的默认行为。