Android的抽屉式导航栏onItemClick位置0从来没有读过

问题描述:

这是我的抽屉式导航栏看起来像:首页= 0,家政服务= 1对Android的抽屉式导航栏onItemClick位置0从来没有读过

enter image description here

因此从技术上讲位置...所以但是,当我单击Home时,onItemClick中返回的位置为1,并打开管家活动。同样的事情发生时,我点击家务管理,它打开洗衣房。因此,它返回位置=点击位置+ 1

这里是我的BaseActivity(这是谁想要使用抽屉式导航等activites扩展)的代码

public class BaseActivity extends AppCompatActivity { 

    protected FrameLayout frameLayout; 
    protected ListView mDrawerList; 
    protected String[] navItemsTitles = {"Home","Housekeeping","Laundry","Food","Reservations","Concierge","Hotel Info"}; 
    protected ArrayList<Items> navItemsArray; 
    protected static int position; 
    private DrawerLayout mDrawerLayout; 
    private static boolean isLaunched = true; 
    private ActionBarDrawerToggle actionBarDrawerToggle; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.base_layout); 

     frameLayout = (FrameLayout) findViewById(R.id.content_frame); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.left_drawer); 

     navItemsArray = new ArrayList<Items>(); 

     Log.i("NAV", "---- navItemsTitles: " + Arrays.toString(navItemsTitles)); 

     navItemsArray.add(new Items("Home", R.drawable.home_icon)); 
     navItemsArray.add(new Items("Housekeeping", R.drawable.housekeeping_icon)); 
     navItemsArray.add(new Items("Laundry", R.drawable.laundry_icon)); 
     navItemsArray.add(new Items("Food", R.drawable.food_icon)); 
     navItemsArray.add(new Items("Reservations", R.drawable.reservation_icon)); 
     navItemsArray.add(new Items("Concierge", R.drawable.concierge_icon)); 
     navItemsArray.add(new Items("Hotel Info", R.drawable.info_icon)); 

     //Adding header on list view 
     View header = (View) getLayoutInflater().inflate(R.layout.list_view_header_layout, null); 
     mDrawerList.addHeaderView(header); 

     // Set the adapter for the list view 
     mDrawerList.setAdapter(new NavigationDrawerListAdapter(this, navItemsArray)); 

     //Set the list's on-item click listener 
     mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
       Log.i("NAV", "---------- onItemClick position: " + position); 
       openActivity(position); 
      } 
     }); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_launcher_round); 
     getSupportActionBar().setHomeButtonEnabled(true); 

     actionBarDrawerToggle = new ActionBarDrawerToggle(
       this, 
       mDrawerLayout, 
       R.string.open_drawer, 
       R.string.close_drawer 
     ) { 
      @Override 
      public void onDrawerClosed(View drawerView) { 
       Log.i("NAV", "---- onDrawerClosed position: " + position); 
       getSupportActionBar().setTitle(navItemsTitles[position]); 
       invalidateOptionsMenu(); 
       super.onDrawerClosed(drawerView); 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       getSupportActionBar().setTitle(getString(R.string.app_name)); 
       invalidateOptionsMenu(); 
       super.onDrawerOpened(drawerView); 
      } 

      @Override 
      public void onDrawerSlide(View drawerView, float slideOffset) { 
       super.onDrawerSlide(drawerView, slideOffset); 
      } 

      @Override 
      public void onDrawerStateChanged(int newState) { 
       super.onDrawerStateChanged(newState); 
      } 
     }; 

     mDrawerLayout.addDrawerListener(actionBarDrawerToggle); 


    } 

    protected void openActivity(int position) { 
     mDrawerLayout.closeDrawer(mDrawerList); 

     BaseActivity.position = position; 

     Log.i("NAV", "------ Selected Item Position::"+position); 

     switch (position) { 
      case 0: 
       startActivity(new Intent(BaseActivity.this, HomeActivity.class)); 
       break; 
      case 1: 
       startActivity(new Intent(BaseActivity.this, HousekeepingActivity.class)); 
       break; 
      case 2: 
       startActivity(new Intent(BaseActivity.this, LaundryActivity.class)); 
       break; 
      case 3: 
       startActivity(new Intent(BaseActivity.this, FoodActivity.class)); 
       break; 
      case 4: 
       startActivity(new Intent(BaseActivity.this, ReservationsActivity.class)); 
       break; 
      case 5: 
       startActivity(new Intent(BaseActivity.this, ConciergeActivity.class)); 
       break; 
      case 6: 
       startActivity(new Intent(BaseActivity.this, HotelInfoActivity.class)); 
       break; 
      default: 
       break; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     //code 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem menuItem) { 
     //code 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     //code 
    } 

    @Override 
    public void onBackPressed() { 
     //code 
    } 
} 

这是从logcat中的信息:

I: ---- navItemsTitles: [Home, Housekeeping, Laundry, Food, Reservations, Concierge, Hotel Info] 
I: ---------- onItemClick position: 1 
I: ------ Selected Item Position::1 
I: ---- navItemsTitles: [Home, Housekeeping, Laundry, Food, Reservations, Concierge, Hotel Info] 

这里是我的NavigationDrawerListAdapter

public class NavigationDrawerListAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<Items> itemsArray; 

    public NavigationDrawerListAdapter(Context context, ArrayList<Items> itemsArray) { 
     this.context = context; 
     this.itemsArray = itemsArray; 
    } 

    private class ViewHolder { 
     TextView itemName; 
     ImageView itemIcon; 
    } 

    @Override 
    public int getCount() { 
     return itemsArray.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return itemsArray.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if(convertView == null) { 
      convertView = inflater.inflate(R.layout.drawer_list_item, null); 
      holder = new ViewHolder(); 

      holder.itemName = (TextView) convertView.findViewById(R.id.item_name_txtview); 
      holder.itemIcon = (ImageView) convertView.findViewById(R.id.item_icon_imgview); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     Items item = (Items) getItem(position); 
     holder.itemName.setText(item.getItemName()); 
     holder.itemIcon.setBackgroundResource((int)item.getIconId()); 

     return convertView; 
    } 
} 

w ^我做错了什么?所有项目中来给出,所以每个人都在自己的正确位置,但点击第一个项目(在位置0)时,当你不得不设置时间抽屉菜单上headerview返回位置== 1

头只是第0位。所以你的主菜单只返回第一个位置。

所以你必须改变这样的

switch (position) { 
      case 1: 
       startActivity(new Intent(BaseActivity.this, HomeActivity.class)); 
       break; 
      case 2: 
       startActivity(new Intent(BaseActivity.this, HousekeepingActivity.class)); 
       break; 
      case 3: 
       startActivity(new Intent(BaseActivity.this, LaundryActivity.class)); 
       break; 
      case 4: 
       startActivity(new Intent(BaseActivity.this, FoodActivity.class)); 
       break; 
      case 5: 
       startActivity(new Intent(BaseActivity.this, ReservationsActivity.class)); 
       break; 
      case 6: 
       startActivity(new Intent(BaseActivity.this, ConciergeActivity.class)); 
       break; 
      case 7: 
       startActivity(new Intent(BaseActivity.this, HotelInfoActivity.class)); 
       break; 
      default: 
       break; 
     } 
+0

所以你的意思是说,最上面的标题 - 与圆形图标和名称被认为是位置0? – codeinprogress

+0

是,用户图标和名称位置0,主页图标是1号位 – Raja

+0

但其headerView,为什么会被计数为列表项目之一?我已明确将其添加为标题。 – codeinprogress

@codeinprogress给予试试这行代码

mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
       Log.i("NAV", "---------- onItemClick position: " + position); 
       **openActivity(position-1);** 
      } 
     }); 
+0

将其替换为相同,并尝试 –

+0

是的,它的工作原理。正如@Raja下面解释说,headerView被计为0.我唯一的问题是为什么?它不是被定义为标头吗?那为什么它算作其他项目的一部分呢? – codeinprogress

+0

它工作正确吗? –