Android 禁用导航抽屉项目(如果已选中),否则应启用抽屉项目
我用的是导航抽屉。导航抽屉中包含元素/项目(如:反馈、报告、设置、刷新)。当我点击一个项目,然后根据选择的选项,用户界面将得到更新 问题是:我从导航抽屉中选择了一个项目,然后UI得到更新。若我再次选择相同的选项,那个么将再次调用所有更新UI的方法 我想要的是,若用户再次单击导航抽屉中的同一项,那个么就不应该调用后台方法 我试图将clickable属性设置为false,但随着该属性的设置,项目变得不可单击。我无法选择该项目 假设我选择了反馈选项,那么下次当我再次打开抽屉时,反馈选项不应该被选择。意味着,连续用户不能选择相同的选项 添加的代码::适配器类:Android 禁用导航抽屉项目(如果已选中),否则应启用抽屉项目,android,navigation-drawer,Android,Navigation Drawer,我用的是导航抽屉。导航抽屉中包含元素/项目(如:反馈、报告、设置、刷新)。当我点击一个项目,然后根据选择的选项,用户界面将得到更新 问题是:我从导航抽屉中选择了一个项目,然后UI得到更新。若我再次选择相同的选项,那个么将再次调用所有更新UI的方法 我想要的是,若用户再次单击导航抽屉中的同一项,那个么就不应该调用后台方法 我试图将clickable属性设置为false,但随着该属性的设置,项目变得不可单击。我无法选择该项目 假设我选择了反馈选项,那么下次当我再次打开抽屉时,反馈选项不应该被选择。意
public class NavDrawerAdapter extends ArrayAdapter<NavDrawerItem> {
private LayoutInflater inflater;
public NavDrawerAdapter(Context context, int textViewResourceId,
NavDrawerItem[] objects) {
super(context, textViewResourceId, objects);
this.inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
NavDrawerItem menuItem = this.getItem(position);
if (menuItem.getType() == NavMenuItem.ITEM_TYPE) {
view = getItemView(convertView, parent, menuItem);
} else {
view = getSectionView(convertView, parent, menuItem);
}
return view;
}
public View getItemView(View convertView, ViewGroup parentView,
NavDrawerItem navDrawerItem) {
NavMenuItem menuItem = (NavMenuItem) navDrawerItem;
NavMenuItemHolder navMenuItemHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.navdrawer_item, parentView,
false);
TextView labelView = (TextView) convertView
.findViewById(R.id.navmenuitem_label);
ImageView iconView = (ImageView) convertView
.findViewById(R.id.navmenuitem_icon);
navMenuItemHolder = new NavMenuItemHolder();
navMenuItemHolder.labelView = labelView;
navMenuItemHolder.iconView = iconView;
convertView.setTag(navMenuItemHolder);
}
if (navMenuItemHolder == null) {
navMenuItemHolder = (NavMenuItemHolder) convertView.getTag();
}
navMenuItemHolder.labelView.setText(menuItem.getLabel());
navMenuItemHolder.iconView.setImageResource(menuItem.getIcon());
return convertView;
}
public View getSectionView(View convertView, ViewGroup parentView,
NavDrawerItem navDrawerItem) {
NavMenuSection menuSection = (NavMenuSection) navDrawerItem;
NavMenuSectionHolder navMenuItemHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.navdrawer_section,
parentView, false);
TextView labelView = (TextView) convertView
.findViewById(R.id.navmenusection_label);
navMenuItemHolder = new NavMenuSectionHolder();
navMenuItemHolder.labelView = labelView;
convertView.setTag(navMenuItemHolder);
}
if (navMenuItemHolder == null) {
navMenuItemHolder = (NavMenuSectionHolder) convertView.getTag();
}
navMenuItemHolder.labelView.setText(menuSection.getLabel());
return convertView;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return this.getItem(position).getType();
}
@Override
public boolean isEnabled(int position) {
return getItem(position).isEnabled();
}
private static class NavMenuItemHolder {
private TextView labelView;
private ImageView iconView;
}
private class NavMenuSectionHolder {
private TextView labelView;
}
}
菜单项接口::
public interface NavDrawerItem {
public int getId();
public String getLabel();
public int getType();
public boolean isEnabled();
public boolean updateActionBarTitle();
}
实现类:
public class NavMenuItem implements NavDrawerItem {
public static final int ITEM_TYPE = 1 ;
private int id ;
private String label ;
private int icon ;
private boolean updateActionBarTitle ;
private NavMenuItem() {
}
public static NavMenuItem create( int id, String label, int icon, boolean updateActionBarTitle, Context context ) {
NavMenuItem item = new NavMenuItem();
item.setId(id);
item.setLabel(label);
item.setIcon(icon);
item.setUpdateActionBarTitle(updateActionBarTitle);
return item;
}
@Override
public int getType() {
return ITEM_TYPE;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean updateActionBarTitle() {
return this.updateActionBarTitle;
}
public void setUpdateActionBarTitle(boolean updateActionBarTitle) {
this.updateActionBarTitle = updateActionBarTitle;
}
}
添加了抽屉侦听器的代码:
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
私有类DrawerItemClickListener实现ListView.OnItemClickListener{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
选择项目(位置);
}
}
我得到了答案。需要保持上次点击的位置。若lastclicked元素和当前单击的元素相同,则无需执行任何操作。如果当前位置不同,则使用当前位置更新lastClicked
private static int lastClicked = 0;
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(lastClicked != position){
selectItem(position);
}
lastClicked = position;
}
}
private static int lastClicked=0;
私有类DrawerItemClickListener实现ListView.OnItemClickListener{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
如果(上次单击!=位置){
选择项目(位置);
}
最后单击=位置;
}
}
请在导航抽屉上放几盏灯,不错!但如果您有一个主页,当导航抽屉中的项目按下“后退”按钮时,您将返回该主页,这并不是一个很好的解决方案。(这里有同样的问题,正在寻找答案。)你能解释一下你的问题吗。我不明白你们所说的“若你们有一个主页,在那个里你们返回到Whean后退按钮是从导航抽屉按下的”是什么意思。因为若抽屉是打开的,我按下后退按钮,那个么抽屉就会简单地关闭。
private static int lastClicked = 0;
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(lastClicked != position){
selectItem(position);
}
lastClicked = position;
}
}