Android 禁用导航抽屉项目(如果已选中),否则应启用抽屉项目

Android 禁用导航抽屉项目(如果已选中),否则应启用抽屉项目,android,navigation-drawer,Android,Navigation Drawer,我用的是导航抽屉。导航抽屉中包含元素/项目(如:反馈、报告、设置、刷新)。当我点击一个项目,然后根据选择的选项,用户界面将得到更新 问题是:我从导航抽屉中选择了一个项目,然后UI得到更新。若我再次选择相同的选项,那个么将再次调用所有更新UI的方法 我想要的是,若用户再次单击导航抽屉中的同一项,那个么就不应该调用后台方法 我试图将clickable属性设置为false,但随着该属性的设置,项目变得不可单击。我无法选择该项目 假设我选择了反馈选项,那么下次当我再次打开抽屉时,反馈选项不应该被选择。意

我用的是导航抽屉。导航抽屉中包含元素/项目(如:反馈、报告、设置、刷新)。当我点击一个项目,然后根据选择的选项,用户界面将得到更新

问题是:我从导航抽屉中选择了一个项目,然后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;
    }
}