首页 > 解决方案 > 我在适配器中得到空指针异常

问题描述

我正在使用 listview 来扩展导航菜单。启动主要活动时出现上述错误。我正在分享适配器和主要活动的代码。

public class DrDrawerListAdapter extends BaseAdapter {
Activity activity;
int[] imageId;

private LayoutInflater inflater = null;
ArrayList<String> titles;

public DrDrawerListAdapter(Activity activity, ArrayList<String> titles, int[] icons){
    this.titles= titles;
    this.activity = activity;
    this.imageId = icons;
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Holder holder = new Holder();
    View view = inflater.inflate(R.layout.dr_drawer_item, null);
    holder.iconView = view.findViewById(R.id.im_icon);
    holder.titleView = view.findViewById(R.id.tv_title);
    holder.titleView.setText(titles.get(position));
    Glide.with(activity.getApplicationContext()).load(imageId[position]).into(holder.iconView);
    return view;
}

public class Holder{
    ImageView iconView;

    TextView titleView;
}

} *** 这里是我的 mainactivity 文件包 com.example.azim.qphew.Dr.view.uiactivity;

导入butterknife.BindView;进口黄油刀。黄油刀;

公共类 DrMainActivity 扩展 AppCompatActivity 实现 View.OnClickListener { private static final String TAG = DrMainActivity.class.getSimpleName();

@BindView(R.id.drawer_layout) DrawerLayout drawerLayout;
//NavigationView navigationView;
@BindView(R.id.toolbar) Toolbar toolbar;
@BindView(R.id.lv_drawer) ListView listView;
@BindView(R.id.dr_profile) ImageButton profileButton;
@BindView(R.id.dr_schedule) ImageButton scheduleButton;
@BindView(R.id.live) ImageButton liveButton;
@BindView(R.id.dr_message) ImageButton messageButton;
@BindView(R.id.dr_logout) ImageButton logoutButton;

private ActionBar actionBar;

ArrayList<String> nav_items;

int[] icons = {R.drawable.time, R.drawable.appointment_history, R.drawable.live_appointment, R.drawable.medicine_reminder,
        R.drawable.video, R.drawable.blog, R.drawable.faq, R.drawable.live_appointment};
DrDrawerListAdapter listAdapter;
ActionBarDrawerToggle toggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dr_main);
    ButterKnife.bind(this);

    setSupportActionBar(toolbar);
    actionBar = getSupportActionBar();
    actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.app_bar_color)));
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeAsUpIndicator(R.drawable.menu);

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_main, new DashboardFragment());
    ft.commit();

    setDrawer();
    init();
    initClickListener();
}

private void setDrawer(){
    if (toggle == null){
        toggle = new ActionBarDrawerToggle(DrMainActivity.this,drawerLayout,R.string.open, R.string.close){
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }

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

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

    }
    toggle.syncState();
    listAdapter = new DrDrawerListAdapter(DrMainActivity.this, nav_items, icons);
    listView.setAdapter(listAdapter);
    listView.setOnItemClickListener(new DrDrawerItemClickListener());

}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.live:
            setLiveQueue();
            break;
        case R.id.dr_profile:
            setProfile();
            break;
        case R.id.dr_schedule:
            setSchedule();
            break;
        case R.id.dr_message:
            setMessage();
            break;
        case R.id.dr_logout:
            setLogout();
            break;
    }

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (toggle.onOptionsItemSelected(item)){
        return true;
    }switch (item.getItemId()){
        default:
            return super.onOptionsItemSelected(item);
    }
}

private class DrDrawerItemClickListener implements ListView.OnItemClickListener{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
       selectItem(position);
    }

    private void selectItem(int position){
        switch (position){
            case 0:
                setDashBoard();
                drawerLayout.closeDrawers();
                break;
            case 1:
                setAppointment();
                drawerLayout.closeDrawers();
                break;
            case 2:
                setLiveQueue();
                drawerLayout.closeDrawers();
                break;
            case 3:
                setMessage();
                drawerLayout.closeDrawers();
                break;
            case 4:
                setVideos();
                drawerLayout.closeDrawers();
                break;
            case 5:
                setBlog();
                drawerLayout.closeDrawers();
                break;
        }
    }
}

private void initClickListener(){
    profileButton.setOnClickListener(this);
    scheduleButton.setOnClickListener(this);
    liveButton.setOnClickListener(this);
    messageButton.setOnClickListener(this);
    logoutButton.setOnClickListener(this);
}

private void init(){
    nav_items = new ArrayList<>();
    nav_items.add("My Account");
    nav_items.add("Search");
    nav_items.add("Live Appointmet");
    nav_items.add("My Appointments");
    nav_items.add("Upgrade to Premium");
    nav_items.add("FAQ");
    nav_items.add("Vedios");
    nav_items.add("Blog");
    //icons = getResources().getIntArray(R.array.dr_drawer_icons);

}

private void setDashBoard(){
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_main, new DashboardFragment());
    ft.addToBackStack(null);
    ft.commit();
}

private void setAppointment(){}

private void setProfile(){
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.frame_main, new DrProfileFragment());
    ft.addToBackStack(null);
    ft.commit();
}

private void setLiveQueue(){
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_main, new DrLiveQueueFragment());
    ft.addToBackStack(null);
    ft.commit();
}

private void setVideos(){}

private void setMessage(){
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_main, new DrMessageFragment());
    ft.addToBackStack(null);
    ft.commit();
}

private void setLogout(){
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.frame_main, new DrLogoutFragment());
    ft.addToBackStack(null);
    ft.commit();
}

private void setBlog(){}

private void setFaq(){}

private void setContactUs(){}


private void setSchedule() {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_main, new DrScheduleFragment());
    ft.addToBackStack(null);
    ft.commit();
}

}

标签: android

解决方案


你应该在调用 setDrawer 方法之前初始化你的数组

使用 setDrawer 更改 init() 订单行

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dr_main);
    ButterKnife.bind(this);

    setSupportActionBar(toolbar);
    actionBar = getSupportActionBar();
    actionBar.setBackgroundDrawable(new  ColorDrawable(getResources().getColor(R.color.app_bar_color)));
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeAsUpIndicator(R.drawable.menu);

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.frame_main, new DashboardFragment());
    ft.commit();

    init();
    setDrawer();

    initClickListener();
}

推荐阅读