在ActionBar中选择Spinner项

时间:2014-03-15 22:21:21

标签: android android-actionbar android-spinner

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

主要问题是:用户应该能够在选择此项目后重新选择操作栏微调器项目。 Android似乎阻止了第二个选择的操作栏微调器项目。

有没有办法能够多次选择一个项目,还是有其他方法可以实现这种行为?

1 个答案:

答案 0 :(得分: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;
    }
}

我希望这有助于你们中的一些人。