gpt4 book ai didi

Android Spinner 数据 View 未在重新选择的项目上更新

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

我正在尝试将 Spinner 自定义为可多项选择。我已成功将其设置为可多选,但是当重新选择一个项目时,微调器内的 View 不会更新。

问题

当在 Spinner 中重新选择一个项目时,我的 SpinnerAdaptergetView() 被调用,生成 View 我想要它,但是 View 不知何故没有显示。我已经遍历了调试器中的所有内容,但在选择不同的项目或重新选择相同的项目时,我找不到任何区别。我已经检查了 Spinner AbsSpinnerAdapterView 中的所有代码,但找不到可能导致此问题的原因。

例如

微调器填充了 6 个项目:选项 1-6。微调器起源于所有未选择的项目。 已选择选项 1、2 和 4。微调器内的 View 正确显示“选择 1、选择 2、选择 4”。

选项 4 未选中(就 Spinner 而言是重新选择)。选项 4 已从列表中正确取消选中,但微调器内的 View 不会更新。 它仍然显示“选择 1、选择 2、选择 4”。通过调试器,我的 SpinnerAdapter 上的 getView() 被调用以及所有内容。由于某种原因, View 实际上并未显示。

选项 2 未选中(这不是微调器的“重新选择”)。这里一切都按预期运行。列表项和 Spinner 内的 View 都会更新。

一些代码

多选微调器

public class MultiSelectSpinner extends Spinner {

private OnItemSelectedListener listener;

public MultiSelectSpinner(Context context) {

super( context );
}

public MultiSelectSpinner(Context context, AttributeSet attrs) {

super( context, attrs );
}

public MultiSelectSpinner(Context context, AttributeSet attrs, int defStyle) {

super( context, attrs, defStyle );
}

@Override
public void setSelection( int position ) {

super.setSelection( position );
if ( listener != null ) {

listener.onItemSelected( this, getSelectedView(), position, getAdapter().getItemId( position ) );
}
}

public void setOnItemSelectedEvenIfUnchangedListener( OnItemSelectedListener listener ) {

this.listener = listener;
}
}

微调适配器

这里只发布重要的部分。省略 getter/setter 等。

public class FormChoiceSpinnerAdapter implements SpinnerAdapter, OnItemSelectedListener {

private Choice[] choices;
private String title;
private final DataSetObservable dataSetObservable = new DataSetObservable();

public FormChoiceSpinnerAdapter(String[] choices, String title) {

setChoices( new Choice[choices.length] );
for (int i = 0; i < choices.length; i++) {

getChoices()[i] = new Choice( choices[i] );
}
}

@Override
public View getView( int position, View convertView, ViewGroup parent ) {

Context context = parent.getContext();
if ( convertView == null ) {

convertView = LayoutInflater.from( context ).inflate( android.R.layout.simple_spinner_item, parent, false );
}

String displayString = "";

for (int i = 0; i < getChoices().length; i++) {

Choice choice = getChoices()[i];

if ( choice.isSelected() ) {

displayString += choice.getLabel() + ", ";
}
}

if ( displayString.length() > 0 ) {

displayString = displayString.trim().substring( 0, displayString.length() - 2 );
}
else {

displayString = getTitle() + "...";
}

( (TextView) convertView ).setText( displayString );

return convertView;
}

@Override
public View getDropDownView( int position, View convertView, ViewGroup parent ) {

Context context = parent.getContext();
if ( convertView == null ) {

convertView = LayoutInflater.from( context ).inflate( R.layout.simple_dropdown_item, parent, false );
}

Choice choice = getChoices()[position];
TextView text = (TextView) convertView.findViewById( android.R.id.text1 );
text.setText( choice.getLabel() );

ImageView selectedImage = (ImageView) convertView.findViewById( R.id.image_selected );
int visibility = choice.isSelected() ? View.VISIBLE : View.GONE;
selectedImage.setVisibility( visibility );

return convertView;
}

@Override
public void onItemSelected( AdapterView<?> parent, View view, int position, long id ) {

Choice choice = getChoices()[position];

choice.setSelected( !choice.isSelected() );

ImageView imageView = (ImageView) view.findViewById( R.id.image_selected );

if ( imageView != null ) {
imageView.setVisibility( choice.isSelected() ? View.VISIBLE : View.GONE );
}
}

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

//No op
}

public static class Choice {

private boolean selected;
private String label;

public Choice(String label) {

this.label = label;
selected = false;
}
}
}

最佳答案

我知道这已经很晚了,但我找到了解决我遇到的类似问题的方法。尝试添加 adapter.notifyDataSetChanged()给你的onItemSelected(AdapterView<?> parent, View view, int pos, long id)覆盖方法。

我的微调器应该显示默认消息,直到用户实际从中选择一个值。除非用户选择下拉列表中的第一项,否则它工作正常,然后微调器不会自行更新。添加adapter.notifyDataSetChanged()成功了。

我也查看了一些源代码,但我无法确切地找到发生了什么,但我有一个想法。自 Spinner不调用 OnItemSelectedListener when selecting the value that is already selected (unless you extend Spinner , which I did with the help of this SO answer ), my guess is that if you try to deselect your most recently selected value, Spinner不会将其识别为取消选择,因此不会重绘 View 。对于您来说,按顺序选择 1、2、4,然后尝试取消选择 4 不会触发重绘响应,但随后取消选择 2 会导致重绘。

我可能是错的,但我知道我们的问题很相似,这对我有用。

关于Android Spinner 数据 View 未在重新选择的项目上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17243421/

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