Spinner技术需求:点击已选中项显示Toast及更新Adapter后刷新控件
嘿,这两个Spinner相关的需求我刚好都实操过,给你一步步讲清楚:
问题1:点击已选中的Spinner选项时通过Toast提示用户,是否可实现?
当然可以实现!不过要注意:默认情况下,Spinner的OnItemSelectedListener当用户再次点击已经选中的选项时,是不会触发回调的——因为系统认为选中状态没变化。所以我们需要自己加一点额外逻辑来捕捉这个操作。
我常用的两种靠谱方法:
- 方法一:自定义Spinner重写performClick()
这种方式更可控,直接自定义Spinner类,在弹出下拉框前记录当前选中项,然后给下拉列表的每个Item设置点击事件,判断是否点击了已选中项:
public class CustomSpinner extends Spinner { private int lastSelectedPosition = 0; public CustomSpinner(Context context) { super(context); } public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean performClick() { lastSelectedPosition = getSelectedItemPosition(); boolean result = super.performClick(); // 获取下拉列表的PopupWindow并设置点击监听 try { Field popupField = Spinner.class.getDeclaredField("mPopup"); popupField.setAccessible(true); ListPopupWindow popup = (ListPopupWindow) popupField.get(this); AdapterView<?> listView = popup.getListView(); listView.setOnItemClickListener((parent, view, position, id) -> { if (position == lastSelectedPosition) { Toast.makeText(getContext(), "你已经选中这个选项啦", Toast.LENGTH_SHORT).show(); } // 手动设置选中项并关闭弹窗 setSelection(position); popup.dismiss(); }); } catch (Exception e) { e.printStackTrace(); } return result; } }
使用时,布局里直接替换成这个CustomSpinner,正常设置Adapter即可,点击已选中项就会弹出提示。
- 方法二:记录选中位置结合普通监听
如果不想自定义Spinner,也可以在初始化时记录当前选中位置,然后给Spinner的下拉列表设置点击监听(需要通过反射获取下拉列表),逻辑和上面类似,只是代码会分散在Activity/Fragment里。
问题2:选中第一个元素后,Adapter内第一个元素值变更,能否刷新Spinner显示新值?
完全可以!而且操作非常简单,核心就是更新Adapter的数据后,调用notifyDataSetChanged()方法,Spinner会自动刷新显示最新内容。
举个ArrayAdapter的示例:
// 初始化Adapter和Spinner ArrayList<String> dataList = new ArrayList<>(Arrays.asList("初始值1", "选项2", "选项3")); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, dataList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); Spinner spinner = findViewById(R.id.spinner); spinner.setAdapter(adapter); spinner.setSelection(0); // 默认选中第一个 // 后续更新第一个元素的操作 dataList.set(0, "更新后的新值1"); adapter.notifyDataSetChanged();
执行完这段代码后,Spinner会立刻显示更新后的第一个元素,而且选中状态依然保持在第一个位置(只要数据源的第一个元素还是我们要选中的项)。
内容的提问来源于stack exchange,提问作者MikisaMaliDojnik
相关产品推荐
相关产品推荐

