【问题标题】:Android Navigation Drawer onItemClick position 0 is never readAndroid Navigation Drawer onItemClick 位置 0 永远不会被读取
【发布时间】:2017-09-17 01:56:00
【问题描述】:

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

所以从技术上讲,Home = 0,Housekeeping = 1...等等

但是,当我单击 Home 时,onItemClick 中返回的位置为 1,它会打开 Housekeeping 活动。当我单击家政时也会发生同样的事情,它会打开洗衣房。所以它返回的位置为 = 点击位置 + 1。

这是我的 BaseActivity 的代码(由其他想要使用 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
    }
}

这是来自 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。

【问题讨论】:

    标签: android navigation-drawer baseadapter


    【解决方案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,主页图标为第一位置
    • 但它是一个headerView,为什么它会被算作列表项之一?我已明确将其添加为标题。
    • 它是一个android默认的纪录片,当你添加标题时,标题被认为是第0位,否则第一个菜单项被认为是第0位。
    【解决方案2】:

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

    【讨论】:

    • 原样替换试试
    • 是的,它有效。正如@Raja 下面解释的那样,headerView 被计为 0。我唯一的问题是为什么?它不是定义为标题吗?那么为什么它被算作其他项目的一部分呢?
    • 是的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2014-04-08
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多