【问题标题】:Reselecting Spinner item in ActionBar在 ActionBar 中重新选择 Spinner 项目
【发布时间】:2014-03-15 22:21:20
【问题描述】:

目前我正在开发一个 Android 应用程序,我们正在使用带有微调器导航的操作栏来获取特定视图。

主要问题是:用户应该能够重新选择一个操作栏微调器项目,在他已经选择了这个项目之后。 Android 似乎阻止了对操作栏微调器项目的第二次选择。

有没有办法可以多次选择一个项目,或者有没有完全其他的方法来实现这种行为?

【问题讨论】:

    标签: android android-actionbar android-spinner


    【解决方案1】:

    好的,经过多次尝试,我找到了一个可行的解决方案,这或多或少是一个“肮脏”的解决方法。

    我只是在我的列表末尾添加一个虚拟项目(例如一个空字符串),用于填充适配器。然后在getDropDownView() 的适配器中检查该位置是否是我的适配器/列表的最后一个元素,并将我的ViewHolder 中的所有元素设置为高度0 以及根布局LayoutParams 的高度。

    但要小心 LayoutParams。您的项目小部件周围的布局无关紧要。 Android 将根布局转换为AbsListView。所以你必须使用AbsListView.LayoutParams 才能将布局高度设置为零。

    这是我如何做到的一个小例子。

    public class CustomSpinnerAdapter extends BaseAdapter {
    
        public static class ViewHolder {
            public RelativeLayout mBaseLayout;
            public TextView mDayLabel;
            public TextView mDateLabel;
        }
    
        private List<String> mItems;
        private String[] mDropdownDates;
    
        public CustomSpinnerAdapter() {
            mItems = new ArrayList<String>();
    
            mItems.add("Today");
            mItems.add("Yesterday");
            mItems.add("2 days ago");
            mItems.add("3 days ago");
            mItems.add("");
    
            // used to fill String array with dates in specified format
            mDropdownDates = populateDates("dd:mm");
        }
    
        @Override
        public int getCount() {
            return mItems.size();
        }
    
        @Override
        public Object getItem(int i) {
            return mItems.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // ...
        }
    
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
    
            ViewHolder viewHolder;
            if(convertView == null) {
                viewHolder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.item_spinner_dropdown_date, parent, false);
    
                viewHolder.mBaseLayout = (RelativeLayout) convertView.findViewById(R.id.spinnerDropdownLayout);
                viewHolder.mDayLabel   = (TextView) convertView.findViewById(R.id.spinnerDropdownDay);
                viewHolder.mDateLabel  = (TextView) convertView.findViewById(R.id.spinnerDropdownDate);
    
                convertView.setTag(viewHolder);
            }
            else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            if(position < getCount() - 1) {
                viewHolder.mDayLabel.setText(mItems.get(position));
                viewHolder.mDateLabel.setText(mDropdownDates[position]);
            }
            else {
                viewHolder.mDayLabel.setHeight(0);
                viewHolder.mDateLabel.setHeight(0);
                viewHolder.mBaseLayout.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0));
                viewHolder.mBaseLayout.setVisibility(View.GONE);
            }
    
            parent.setVerticalScrollBarEnabled(false);
    
            return convertView;
        }
    }
    

    我希望这对你们中的一些人有所帮助。

    【讨论】:

    • 我不知道你是否还会看到这个,因为这是一篇相当老的帖子,但我一直在处理同样的问题。我正在尝试实现您发布的代码作为解决方法,但我担心我的应用程序在实例化时会因 NullPointerException 而崩溃(当我注释掉此类的实例化并使用 arrayAdapter 时,代码运行但双击不起作用) .如果您有时间查看我做错了什么,我很乐意在这篇文章或电子邮件中分享代码作为“答案”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多