gpt4 book ai didi

android - 为什么Spinner控件在setSelection之后事件setOnItemSelectedListener仍然显示提示信息?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:27 25 4
gpt4 key购买 nike

我在spinnerRanger.setSelection之后写了Spinner的事件setOnItemSelectedListener。

我觉得第一次运行APP时,Toast.makeText(...)不会启动,但还是有提示信息,为什么?

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.cleanup_delete_fragment_old, container, false);

mView = rootView;
mContext = rootView.getContext();

InitValueOfControls();
return rootView;
}

private void InitValueOfControls() {
spinnerRanger = (Spinner)mView.findViewById(R.id.spinner);
PublicParFun.FillRangeSpinner(mView, spinnerRanger);
spinnerRanger.setSelection(PublicParFun.GetIndexOfRangeDeleteOld(mContext));
spinnerRanger.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(mContext, "My "+position, Toast.LENGTH_LONG).show();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}

特雷弗·卡罗瑟斯:

如果我在 Selection 监听器事件之前插入一个 DoLongTimeOperation(),它还会显示 toast 吗?

private void InitValueOfControls() {
spinnerRanger = (Spinner)mView.findViewById(R.id.spinner);
PublicParFun.FillRangeSpinner(mView, spinnerRanger);
spinnerRanger.setSelection(PublicParFun.GetIndexOfRangeDeleteOld(mContext));

DoLongTimeOperation();

spinnerRanger.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(mContext, "My " + position, Toast.LENGTH_LONG).show();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}

代码A:

private void InitValueOfControls() {
spinnerRanger = (Spinner)mView.findViewById(R.id.spinner);
PublicParFun.FillRangeSpinner(mView, spinnerRanger);
spinnerRanger.setSelection(PublicParFun.GetIndexOfRangeDeleteOld(mContext));

DoLongTimeOperation();

spinnerRanger.post(new Runnable() {
@Override
public void run() {
spinnerRanger.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(mContext, "My "+position, Toast.LENGTH_LONG).show();
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
});
}

代码 B

private void InitValueOfControls() {
spinnerRanger = (Spinner)mView.findViewById(R.id.spinner);
PublicParFun.FillRangeSpinner(mView, spinnerRanger);
spinnerRanger.setSelection(PublicParFun.GetIndexOfRangeDeleteOld(mContext));
spinnerRanger.post(new Runnable() {
@Override
public void run() {
spinnerRanger.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
// ...
}
}
});
}

代码 C

private void InitValueOfControls() {
spinnerRanger = (Spinner)mView.findViewById(R.id.spinner);
PublicParFun.FillRangeSpinner(mView, spinnerRanger);
spinnerRanger.setSelection(PublicParFun.GetIndexOfRangeDeleteOld(mContext));
spinnerRanger.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
// ...
});
}

最佳答案

我只是用我自己的基本 ArrayAdapter 运行这段代码,它在创建 View 并在设置监听器之前调用 setSelection() 时立即显示 toast(如上所示)。

这绝对是不直观的,因为您是在设置选择之后设置监听器。深入了解它的唯一方法是深入研究源代码。在四处翻找之后,我发现他们正在发布 this Runnable到主线程以通知选择更改的监听器。这是事件的顺序:

  1. Spinner View 膨胀
  2. 适配器(数据源)集
  3. 发布选择集和 SelectionNotifier Runnable
  4. 在 Spinner 上设置选择监听器
  5. 在主线程上处理的 SelectionNotifier
  6. SelectionNotifier 调用 onItemSelected() 并显示 Toast

发布一个 Runnable 来设置您的选择监听器,以便它在第一次传递的 SelectionNotifier 之后得到处理:

private void InitValueOfControls()
{
spinnerRanger=(Spinner)mView.findViewById(R.id.spinner);
PublicParFun.FillRangeSpinner(mView, spinnerRanger);

spinnerRanger.setSelection(PublicParFun.GetIndexOfRangeDeleteOld(mContext));
spinnerRanger.post(new Runnable() {
@Override
public void run() {
spinnerRanger.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {...}
}
});
}

新的事件顺序是:

  1. Spinner View 膨胀
  2. 适配器(数据源)集
  3. 发布选择集和 SelectionNotifier Runnable
  4. 发布了在 Spinner 上设置 Selection 监听器的 Runnable
  5. 在主线程上处理的 SelectionNotifier
  6. SelectionNotifier 没有要通知的监听器,因此它什么都不做。没有显示 TOAST!
  7. 我们在 Spinner 上设置选择监听器的 Runnable 在主线程上处理并设置选择监听器

关于android - 为什么Spinner控件在setSelection之后事件setOnItemSelectedListener仍然显示提示信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com