This is how my navigation drawer looks like:
So technically position of Home = 0, Housekeeping = 1...so on
However when I click Home, the position returned in the onItemClick is 1 and it opens the Housekeeping activity. Same thing happens when I click Housekeeping, it opens Laundry. So it returns the position as = clicked position + 1.
Here is the code for my BaseActivity (which is extended by other activites who want to use Navigation Drawer)
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
}
}
This is the info from 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]
Here is my 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;
}
}
What am I doing wrong? All the items come in as given, so everyone is at their right position, but when 1st item (at position 0) is clicked, it returns position == 1.
When you have to set headerview on drawer menu that time header is only 0th position. so your home menu return only 1st position.
so you have to change like this
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;
}