永远不会读取Android导航抽屉onItemClick位置0

时间:2017-09-16 17:41:30

标签: android navigation-drawer baseadapter

这就是我的导航抽屉的样子:

enter image description here

因此技术上Home = 0,Housekeeping = 1 ......等等

但是,当我单击Home时,onItemClick中返回的位置为1,它将打开Housekeeping活动。当我点击Housekeeping时它会发生同样的事情,它会打开洗衣店。因此它将位置返回=单击位置+ 1。

以下是我的BaseActivity的代码(由其他想要使用导航抽屉的活动扩展)

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;
    }
}

我做错了什么?所有项目都按照给定的方式进入,因此每个人都处于正确的位置,但是当点击第一个项目(位置0)时,它返回位置== 1.

2 个答案:

答案 0 :(得分: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;
        }

答案 1 :(得分:1)

@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);**
            }
        });