动态设置微调器的选择,不触发 OnItemSelectedListener
Dynamically setSelection of spinner, do not trigger OnItemSelectedListener
我有一个 activity,它有许多级联微调器,在第一个 select 之后,第二个微调器初始化并填充数据,在第二个 select 项之后,第三个微调器初始化并填充数据等等。
对于每个微调器,我都是这样创建的,它是迭代的:
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);
}
当 select 由用户使用时一切正常,但是当我动态使用 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!
}
问题就在这里。第一次微调器大小为 1,但在设置 selection 之后,侦听器不调用并且第二个微调器不创建。
我还认为这是因为操作很耗时,所以尝试使用 运行-able 和 post 一些延迟,但它没有用。
我认为您想要实现的目标可以通过 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
会触发。
我终于找到了一个令人毛骨悚然的解决方案。看来问题是 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);
}
这解决了我的问题,所有微调器都正确创建和填充。但在一些慢速设备中,延迟时间应该增加,这就是为什么我说令人毛骨悚然的方式。我正在研究这个,如果我找到更好的方法,我会更新解决方案。
我有一个 activity,它有许多级联微调器,在第一个 select 之后,第二个微调器初始化并填充数据,在第二个 select 项之后,第三个微调器初始化并填充数据等等。
对于每个微调器,我都是这样创建的,它是迭代的:
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);
}
当 select 由用户使用时一切正常,但是当我动态使用 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!
}
问题就在这里。第一次微调器大小为 1,但在设置 selection 之后,侦听器不调用并且第二个微调器不创建。
我还认为这是因为操作很耗时,所以尝试使用 运行-able 和 post 一些延迟,但它没有用。
我认为您想要实现的目标可以通过 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
会触发。
我终于找到了一个令人毛骨悚然的解决方案。看来问题是 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);
}
这解决了我的问题,所有微调器都正确创建和填充。但在一些慢速设备中,延迟时间应该增加,这就是为什么我说令人毛骨悚然的方式。我正在研究这个,如果我找到更好的方法,我会更新解决方案。