Ken*_*nji 5 select android spinner onitemclicklistener
我有一个活动,它有许多级联微调器,在选择第一个微调器后,第二个微调器初始化并填充数据,从第二个微调器中选择项目后,第三个微调器初始化并填充数据等等。
对于每个微调器,我都像这样创建它们并且它是迭代的:
public ArrayList<MaterialSpinner> spinnerlist = new ArrayList<>();
public void createView(){
final MaterialSpinner spinner = new MaterialSpinner(context);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){//...after select item next spinner creates with calling createView() iteratively}
loadSpinnerData(); // set adapter and more
spinnerlist.add(spinner);
}
Run Code Online (Sandbox Code Playgroud)
当用户选择时,一切都会顺利,但setSelection(positionOfItem)不幸的是,当我动态使用时
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
不要打电话。我不知道为什么会发生这种情况。
for (int i = 0; i < some_value; i++) {
int positionOfItem = get_proper_position;
spinnerList.get(i).setSelection(positionOfItem); //this not trigger onItemSelect!
}
Run Code Online (Sandbox Code Playgroud)
问题就在这里。第一次微调器大小为 1,但在 setselection 之后,侦听器不会调用并且第二个微调器不会创建。
我还认为这是因为操作耗时,所以尝试使用可运行并发布一些延迟但它不起作用。
我终于找到了一个令人毛骨悚然的解决方案。看来问题出在android系统上,需要一些时间来创建项目和视图。当我调用onClickListener第一个微调器时,它应该创建第二个微调器并填充数据,这是一个耗时的操作。所以我必须以可变的时间间隔为每个项目设置延迟:
for (int i = 0; i < some_value; i++) {
selectItemOfSpinner(i);
}
private void selectItemOfSpinner(final int i) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
MaterialSpinner spinner = spinnerList.get(i);
int positionOfItem = get_proper_position;
spinner.setSelection(positionOfItem, true);
}
}, 50*i);
}
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题,所有旋转器都能正确创建和填充。但在一些慢速设备中,延迟时间应该增加,这就是为什么我说令人毛骨悚然的方式。我正在研究这个问题,如果找到更好的方法,我将更新解决方案。