具有自定义适配器的微调器在选择时不会消失

时间:2012-10-16 15:17:10

标签: android android-widget android-spinner

我正在使用Spinner和一个名为AlgorithmAdapter的自定义适配器类,原则上一切正常,这意味着出现了微调框弹出窗口,所有包含视图的窗口都被正确膨胀。然而,我无法找到的是我在选择时如何“告诉”微调器。当然我知道setSelection(),但是没有处理弹出窗口并将焦点返回到Activity。

所以这里有一些相关的代码:

在我的活动中,我创建了这样的适配器:

SpinnerAdapter spinnerAdapter = new AlgorithmAdapter(
    this,
    algorithmSpinner,
    R.layout.algo_spinner_item_detail,
    res.getStringArray(R.array.anaglyph_algorithm_titles),
    res.getStringArray(R.array.anaglyph_algorithm_descriptions),
    res.obtainTypedArray(R.array.anaglyph_algorithm_icons),
    algorithmSpinner.getSelectedItemPosition()
);

algorithmSpinner.setAdapter(spinnerAdapter);

AgorithmAdapter的构造函数具有以下签名:

public AlgorithmAdapter(Context context, Spinner spinner, int viewResourceId, String[] titles,
        String[] descriptions, TypedArray icons, int selectedPosition) {

getDropDownView()的{​​{1}}方法:

AlgorithmAdapter

其中@Override public View getDropDownView(final int position, View convertView, ViewGroup parent) { if(convertView == null) { LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(viewResourceId, parent, false); } final ImageView icon = (ImageView) convertView.findViewById(R.id.algoItemIcon); final TextView title = (TextView) convertView.findViewById(R.id.algoItemTitle); final TextView description = (TextView) convertView.findViewById(R.id.algoItemDescription); final RadioButton radio = (RadioButton) convertView.findViewById(R.id.algoItemRadio); icon.setImageDrawable(icons.getDrawable(position)); title.setText(titles[position]); description.setText(descriptions[position]); radioGroup.add(radio); /* it's essential to uncheck in case the positions do not match, because * the system reuses views that could still have a checked radio button */ radio.setChecked(position == selectedPosition); convertView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { // uncheck every other radio button for(RadioButton each : radioGroup) each.setChecked(false); // inform adapter and user that this button is selected now radio.setChecked(true); selectedPosition = position; spinner.setSelection(position); } }); return convertView; } 是所有下拉视图中所有RadioButtons的列表,以便管理当前检查哪一个以及哪些必须取消选中。

这一切都很有效,除了弹出窗口没有关闭radioGroup(它本身正在工作)。

我还尝试将setSelection()附加到Spinner并管理其中的选择内容,但是会抛出一个异常OnItemClickListener,这真的很烦人,因为它感觉好像框架就在我的方式,而不是在这一点上帮助我。但无论如何,这就是我必须将Spinner传递给适配器的原因,我很高兴我有一个不同的解决方案......

所以我唯一缺少的是我如何“关闭”或“处理”Spinners下拉菜单。有人可以帮我吗?这甚至是在附近的路上吗?这不是那么困难,因为为Spinners编写自定义适配器是一项非常基本的任务。

编辑:不知道这是否有帮助,但也许有人在我的下拉视图项的布局文件中发现错误。 setOnItemClickListener cannot be used with a spinner

algo_spinner_item_detail.xml

在选择项目后,你如何关闭/处理finner的Spinner下拉?

1 个答案:

答案 0 :(得分:0)

这就是我的诀窍(警告:不要向你的孩子展示这个代码,你肯定会为此付出代价):

在我onClick的{​​{1}}方法中,我放了这行代码:

convertView

它不仅摆脱了包含((View) parent.getParent().getParent().getParent().getParent()).setVisibility(View.GONE); s的LinearLayout,而且使convertView不可见,在显示对话框/下拉菜单的同时使活动屏幕变暗

我仍然在寻求更好的解决方案。