微调:当选择的项目是一样的onItemSelected不叫 [英] Spinner : onItemSelected not called when selected item remains the same

查看:86
本文介绍了微调:当选择的项目是一样的onItemSelected不叫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 OnItemSelectedListener 我的微调,但是当所选择的项目是一样的,因为它不叫在previous之一。显然, OnClickListener 不是一个微调选项。 我需要赶上每次一个项目一个用户的点击。你知道吗?

也许是事实,这微调里面的动作条扰乱了正常的行为?

  @覆盖
公共无效onCreateOptionsMenu(功能菜单,MenuInflater充气){
    inflater.inflate(R.menu.tracklist_menu,菜单);
    微调微调=(微调)menu.findItem(R.id.option_ordering_spinner)
            .getActionView();
    spinner.setAdapter(mSpinnerAdapter);
    spinner.setSelection(prefsHelper.getOrderingSpinnerPos(preFS));
    spinner.setOnItemSelectedListener(新OnItemSelectedListener(){

        @覆盖
        公共无效onItemSelected(适配器视图<>母公司视图中查看,
                INT位置,长的id){
            字符串str =选择;
            的System.out.println(STR);
            如果(optionMenuInitialized){

                开关(位置){
                情况下0:
                    // RDM
                    getActivity()
                            .sendBroadcast(
                                    新的意向(
                                            MyIntentAction.DO_RESHUFFLE_PLAYLIST));
                    smp.setCurrentTracklistCursorPos(-1);
                    trackAdapter.notifyDataSetChanged();
                    打破;
                情况1:
                    // 艺术家
                    getActivity()
                            .sendBroadcast(
                                    新的意向(
                                            MyIntentAction.DO_ORDER_PLAYLIST_BY_ARTIST));
                    smp.setCurrentTracklistCursorPos(-1);
                    trackAdapter.notifyDataSetChanged();
                    打破;
                案例2:
                    // 夹
                    getActivity()
                            .sendBroadcast(
                                    新的意向(
                                            MyIntentAction.DO_ORDER_PLAYLIST_BY_FOLDER));
                    smp.setCurrentTracklistCursorPos(-1);
                    trackAdapter.notifyDataSetChanged();
                    打破;
                }
                prefsHelper.setOrderingSpinnerPos(prefEditor,位置);
                prefEditor.commit();
            }
            optionMenuInitialized = TRUE;
        }

        @覆盖
        公共无效onNothingSelected(适配器视图<>母公司){
        }
    });
}
 

解决方案

好吧,我终于找到了一个解决方案,通过创建自己的类扩展微调:

 公共类MySpinner扩展微调{
OnItemSelectedListener监听;

公共MySpinner(上下文的背景下,ATTRS的AttributeSet){
    超(背景下,ATTRS);
}

@覆盖
公共无效setSelection(INT位置){
    super.setSelection(位置);
    如果(听众!= NULL)
        listener.onItemSelected(NULL,NULL,位置,0);
}

公共无效setOnItemSelectedEvenIfUnchangedListener(
        OnItemSelectedListener监听器){
    this.listener =侦听器;
}
}
 

I have a OnItemSelectedListener for my Spinner, but it is not called when the selected item is the same as the previous one. Apparently the OnClickListener is not an option for a Spinner. I need to catch everytime a user click on an item. Any idea?

Maybe the fact that this Spinner is inside the ActionBar disturbs normal behavior?

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.tracklist_menu, menu);
    Spinner spinner = (Spinner) menu.findItem(R.id.option_ordering_spinner)
            .getActionView();
    spinner.setAdapter(mSpinnerAdapter);
    spinner.setSelection(PrefsHelper.getOrderingSpinnerPos(prefs));
    spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            String str = "selected";
            System.out.println(str);
            if (optionMenuInitialized) {

                switch (position) {
                case 0:
                    // rdm
                    getActivity()
                            .sendBroadcast(
                                    new Intent(
                                            MyIntentAction.DO_RESHUFFLE_PLAYLIST));
                    smp.setCurrentTracklistCursorPos(-1);
                    trackAdapter.notifyDataSetChanged();
                    break;
                case 1:
                    // artist
                    getActivity()
                            .sendBroadcast(
                                    new Intent(
                                            MyIntentAction.DO_ORDER_PLAYLIST_BY_ARTIST));
                    smp.setCurrentTracklistCursorPos(-1);
                    trackAdapter.notifyDataSetChanged();
                    break;
                case 2:
                    // folder
                    getActivity()
                            .sendBroadcast(
                                    new Intent(
                                            MyIntentAction.DO_ORDER_PLAYLIST_BY_FOLDER));
                    smp.setCurrentTracklistCursorPos(-1);
                    trackAdapter.notifyDataSetChanged();
                    break;
                }
                PrefsHelper.setOrderingSpinnerPos(prefEditor, position);
                prefEditor.commit();
            }
            optionMenuInitialized = true;
        }

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

解决方案

Ok, I finally found a solution, by creating my own class extending Spinner :

public class MySpinner extends Spinner {
OnItemSelectedListener listener;

public MySpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void setSelection(int position) {
    super.setSelection(position);
    if (listener != null)
        listener.onItemSelected(null, null, position, 0);
}

public void setOnItemSelectedEvenIfUnchangedListener(
        OnItemSelectedListener listener) {
    this.listener = listener;
}
}

这篇关于微调:当选择的项目是一样的onItemSelected不叫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆