【问题标题】:Dynamically setSelection of spinner, do not trigger OnItemSelectedListener动态设置微调器,不触发 OnItemSelectedListener
【发布时间】:2016-10-16 07:00:40
【问题描述】:

我有一个有许多级联微调器的活动,在选择第一个微调器后,第二个微调器初始化并填充数据,在从第二个微调器中选择项目后,第三个微调器初始化并填充数据等等。

对于每个微调器,我都会像这样创建它们并且它是迭代的:

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!
        }

问题就在这里。第一次微调器大小为 1,但在 setselection 之后,侦听器不调用,第二个微调器不创建。

我还认为这是因为耗时的操作,所以尝试使用 run-able 并发布一些延迟,但它不起作用。

【问题讨论】:

  • 我假设您在初始化 setOnItemSelectedListner 之前正在执行 setSelection。它总是应该调用 setOnItemSelectedListner。请检查该场景并分享您的代码
  • @MiralBhalani 我更新了问题。第一个微调器已创建并初始化并添加到列表中,但它在选择时不起作用
  • 你能提供一些关于 categoriesId 的信息吗?
  • 能否请您尝试移动 loadSpinnerData();在 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 之前
  • onItemSelecteListner 只会在选择任何与前一个不同的新项目时调用loadSpinnerData()

标签: android select spinner onitemclicklistener


【解决方案1】:

我终于找到了一个令人毛骨悚然的解决方案。似乎问题在于需要一些时间来创建项目和视图的 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);

}

这解决了我的问题,所有微调器都能正确创建和填充。但在一些慢速设备中,延迟时间应该会增加,这就是为什么我说令人毛骨悚然的方式。我正在努力解决这个问题,如果我找到更好的方法,我会更新解决方案。

【讨论】:

  • 而不是 postDelayed 只是使用 post。这将推迟 run 内部的代码执行,直到绘制布局。无需设置任意延迟时间。
【解决方案2】:

我认为你想要实现的目标可以通过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 不会触发 OnItemSelectedListenerperformItemClick 会触发。

【讨论】:

  • 我会检查并通知你
  • (查看)spinner.getChildAt(positionOfItem);返回空
  • int positionOfItem = get_proper_position; positionOfItem 返回什么?
  • 它是 int positionOfItem = spinnerList.get(i).getPositionOfItem (categoryListNames.get(i).getName());并且工作正常,因为我的第一个微调器填充并正确选择,但只需执行点击:(
  • 所以,如果我做对了,您的 positionOfItem 和循环计数器 i 在技术上是相同的值,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多