推荐安卓开发神器(里面有各种UI特效和android代码库实例)
前言
为Spinner适配完数据后需要设置其默认选项,但是发现直接setSelection(int position)有时候不管用,打开选项又发现已经选中了,但是显示出来的选项又始终默认第一个
正文
问题很奇怪,此外还发现适配完数据后会默认选中第一个,并且这个默认选中第一个的操作并不是马上执行的,而是一段时候后再执行,并触发OnItemSelectedListener事件。下面直奔主题:
旧代码:
spinner.setAdapter(adapter);
spinner.setSelection(2);
spinner.setSelection(2);
新代码:
spinner.setAdapter(adapter);
spinner.setSelection(2,true);
spinner.setSelection(2,true);
在来看setSelection有两个参数的函数重载的说明:
setSelection(int position, boolean animate)
英文:Jump directly to a specific item in the adapter data.
中文:直接跳到数据适配器中指定项。
以下是两个函数的源代码:
/**
* Jump directly to a specific item in the adapter data.
*/
public void setSelection(int position, boolean animate) {
// Animate only if requested position is already on screen somewhere
boolean shouldAnimate = animate && mFirstPosition <= position &&
position <= mFirstPosition + getChildCount() - 1;
setSelectionInt(position, shouldAnimate);
}
@Override
public void setSelection(int position) {
setNextSelectedPositionInt(position);
requestLayout();
invalidate();
}
* Jump directly to a specific item in the adapter data.
*/
public void setSelection(int position, boolean animate) {
// Animate only if requested position is already on screen somewhere
boolean shouldAnimate = animate && mFirstPosition <= position &&
position <= mFirstPosition + getChildCount() - 1;
setSelectionInt(position, shouldAnimate);
}
@Override
public void setSelection(int position) {
setNextSelectedPositionInt(position);
requestLayout();
invalidate();
}
结束
看起来像是专门准备了一个函数在数据适配(填充)完后设置默认值的,可惜API文档还没有翻译到这里,不然少走这个弯路了 :)
<script></script>
相关推荐
Spinner需要一个数据源来填充它的选项,这通常是一个ArrayList或ArrayAdapter。ArrayAdapter是Android中的适配器类,它可以将数据绑定到UI组件,如ListView或Spinner。创建ArrayAdapter时,需要传入上下文、资源ID...
3. **绑定数据**:在自定义的适配器中填充数据,然后将其设置到PopupWindow的视图组件上。 4. **监听事件**:为Spinner添加OnItemSelectedListener,当用户选择项时,更新PopupWindow的内容或隐藏PopupWindow。 在`...
4. **初始化状态**:在Activity的onCreate()方法中,可能需要预先设置一个默认的省份,然后根据这个省份填充城市Spinner。 四、代码示例 ```java // 创建省份和城市的适配器 ArrayAdapter<String> provinceAdapter ...
通常,最外层的Spinner数据加载完毕后就可以直接显示,后续级的Spinner则在用户首次选择时才加载数据。 7. **性能优化**:由于多级联动可能导致大量的数据操作,因此需要注意性能优化。例如,可以只在必要时加载...
- **数据加载**:根据用户选择的级别,从数据库或网络加载相应级别的数据,并填充到下一个Spinner。 - **UI布局**:在XML布局文件中添加三个Spinner,并设置适配器。 4. **readme.md** 这个文件可能是对整个项目...
- Spinner是Android中的一种下拉选择控件,它提供了简单的下拉列表功能,可以设置默认值和监听事件。 - 在布局文件中添加三个Spinner,分别为省、市、县,设置它们的id。 4. **三级联动逻辑** - 当用户在省的...
- 在Java或Kotlin类中,开发者会创建适配器,填充数据,然后将其设置给Spinner实例。 - `OnItemSelectedListener`接口的实现用于处理用户选择事件,例如更新UI或者其他业务逻辑。 4. **自定义适配器** 如果需要...
[Android]为Spinner填充数据后设置默认值的问题 - 农民伯伯 - 博客园.mht352.91 KB [Android]使用ActivityGroup来切换Activity和Layout - 农民伯伯 - 博客园.mht459.50 KB [Android]发布Sqlite数据库 - 农民伯伯 - ...
3. **适配器适配**:创建自定义的ArrayAdapter,用于填充Spinner的数据。适配器需要实现OnItemSelectedListener接口,监听用户的选择变化。 4. **数据加载**:在Activity或Fragment的onCreate方法中,读取省市区...
在本项目中,由于是离线应用,数据很可能预存在应用的资源文件中,如assets目录下的JSON文件,通过Java代码解析并填充到Spinner的数据源。 **4. 监听事件处理** 为了实现联动效果,需要监听每个Spinner的选择事件。...
3. 填充UI:将解析好的数据填充到Spinner中,使用`ArrayAdapter`或自定义的适配器进行绑定。 四、事件监听与处理 1. 设置OnItemSelectedListener:为每个Spinner设置监听器,监听用户的选中事件。 2. 事件响应:在...
这涉及到如何创建视图,如何根据数据填充视图,以及如何确保视图和数据的一致性。 6. **事件监听**:为了响应用户的交互,如点击事件,开发者通常会在Adapter或Activity中设置监听器。例如,当用户在Spinner中选择...
2. 创建数据源:可以使用ArrayAdapter、CursorAdapter或自定义Adapter来填充Spinner的数据。 ```java String[] items = {"Option 1", "Option 2", "Option 3"}; ArrayAdapter<String> adapter = new ArrayAdapter...
2. **绑定数据**:通过ArrayAdapter或者其他适配器为Spinner填充年份数据,通常可以是当前年份到未来若干年的范围。MonthPicker则需提供1到12的月份选项。 3. **事件监听**:为Spinner设置OnItemSelectedListener...
在本案例中,解析JSON数据得到省份、城市和区县的列表,然后填充到Spinner中。 4. **适配器(Adapter)**: Android中的适配器是连接数据源和UI组件的关键,它将数据转化为可以显示在视图上的形式。在这个例子中,...
// 设置默认值,填充spinner数据,添加监听器... } ``` 这样,初学者就可以通过简单的几行代码将这个选择省市的工具类集成到自己的项目中,提高开发效率。同时,这个工具类也可以作为学习Android数据绑定、事件...
3. **数据源**: 为了填充Spinner,需要创建一个数据源。对于年,数据源通常是当前年份到一定范围内的年份列表;对于月,数据源是1到12的整数列表;对于日,根据所选年月,数据源应包含该月的所有可能天数。 4. **...
Demo会展示如何填充数据源,设置监听器来响应用户的选择。 7. **ProgressBar** 和 **SeekBar**:这两个控件用于表示进度。ProgressBar是静态的进度条,而SeekBar允许用户手动调整进度。在Demo中,你会看到它们的...
- 考虑使用缓存机制,如`SharedPreferences`或数据库,保存用户之前的省市区选择,以便快速填充默认值。 通过以上步骤,我们可以在Android应用中实现一个功能完善的省市区选择弹出框。实际开发中,可能还需要根据...