【发布时间】:2014-03-15 22:21:20
【问题描述】:
目前我正在开发一个 Android 应用程序,我们正在使用带有微调器导航的操作栏来获取特定视图。
主要问题是:用户应该能够重新选择一个操作栏微调器项目,在他已经选择了这个项目之后。 Android 似乎阻止了对操作栏微调器项目的第二次选择。
有没有办法可以多次选择一个项目,或者有没有完全其他的方法来实现这种行为?
【问题讨论】:
标签: android android-actionbar android-spinner
目前我正在开发一个 Android 应用程序,我们正在使用带有微调器导航的操作栏来获取特定视图。
主要问题是:用户应该能够重新选择一个操作栏微调器项目,在他已经选择了这个项目之后。 Android 似乎阻止了对操作栏微调器项目的第二次选择。
有没有办法可以多次选择一个项目,或者有没有完全其他的方法来实现这种行为?
【问题讨论】:
标签: android android-actionbar android-spinner
好的,经过多次尝试,我找到了一个可行的解决方案,这或多或少是一个“肮脏”的解决方法。
我只是在我的列表末尾添加一个虚拟项目(例如一个空字符串),用于填充适配器。然后在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;
}
}
我希望这对你们中的一些人有所帮助。
【讨论】: