目前我正在开发一个Android应用程序,我们正在使用带有微调器导航的操作栏来显示特定视图。
主要问题是:用户应该能够在选择此项目后重新选择操作栏微调器项目。 Android似乎阻止了第二个选择的操作栏微调器项目。
有没有办法能够多次选择一个项目,还是有其他方法可以实现这种行为?
答案 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;
}
}
我希望这有助于你们中的一些人。