我有一个活动有许多级联微调器,在选择第一个后,第二个微调器初始化和填充数据,然后从第二个,第三个微调器初始化和填充数据后选择项目等等。
对于每个微调器,我像这样创建它们并且它是迭代的:
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);
}
当用户选择时,每件事情都是正确的,但是当我动态地使用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!
}
问题出在这里。 spinner大小首次为1,但在setselection之后,侦听器不会调用,第二个微调器不会创建。
我还认为这是因为耗时的操作,所以尽量使用可运行的并发布一些延迟,但它没有用。
答案 0 :(得分:2)
我终于找到了令人毛骨悚然的解决方案。似乎问题是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);
}
这解决了我的问题,并且所有微调器都能正确地创建和填充。但在一些缓慢的设备中延迟时间应该增加,这就是为什么我说令人毛骨悚然的方式。我正在研究这个问题,如果找到更好的方法,我会更新解决方案。
答案 1 :(得分:0)
我认为您可以通过performItemClick
实现您想要实现的目标for (int i = 0; i < some_value; i++) {
int positionOfItem = get_proper_position;
MaterialSpinner spinner = spinnerList.get(i);
spinner.setSelection(positionOfItem);
View itemView = (View)spinner.getChildAt(positionOfItem);
long itemId = your_spinner.getAdapter().getItemId(positionOfItem);
spinner.performItemClick(itemView, positionOfItem, itemId);
}
setSelection
并非触发OnItemSelectedListener
,但performItemClick
不会。{/ p>