Android 从横向切换到纵向会产生NullPointerException

Android 从横向切换到纵向会产生NullPointerException,android,nullpointerexception,Android,Nullpointerexception,我正在制作一个在列表中显示事件的应用程序。每个事件都有一个自定义布局(带有BaseAdapter)。如果我仅以纵向或横向方式使用手机,则可以,但如果我在列表中并旋转手机以更改方向,则BaseAdapter会生成NullPointerException。代码如下: public class ShowListAdapter extends BaseAdapter { private Activity a; private List<Map<String, String&g

我正在制作一个在列表中显示事件的应用程序。每个事件都有一个自定义布局(带有BaseAdapter)。如果我仅以纵向或横向方式使用手机,则可以,但如果我在列表中并旋转手机以更改方向,则BaseAdapter会生成
NullPointerException
。代码如下:

public class ShowListAdapter extends BaseAdapter {
    private Activity a;
    private List<Map<String, String>> monthList;
    private static LayoutInflater inflater;

    public ShowListAdapter(Activity act, List<Map<String, String>> msc) {
        a = act;
        monthList = msc;
        inflater = (LayoutInflater) a.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return monthList.size();
    }

    public Object getItem(int i) {
        return i;
    }

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View v = view;

        if (view == null) {
            v = inflater.inflate(R.layout.list_item, null);
        }

        /* Some random code that formats the view goes here */

        return v;
    }
}
ShowHolder类有一个在应用程序的初始屏幕中“生成”的静态变量

活动
有多个选项卡,每个选项卡都有自己的
列表片段
。我想,代码中唯一重要的部分是:

public Fragment getItem(int position) {
    return new ListForMonth(position);
}

为什么代码会抛出这个错误?我怎样才能修好它?提前谢谢

小心,因为当您从横向切换到纵向或从纵向切换到横向时,活动会重新启动。因此,覆盖
onResume()
方法并处理屏幕方向。

你是对的,问题在这几行

public Fragment getItem(int position) {
return new ListForMonth(position);
}
当方向发生变化时,Android会使用默认构造函数调用fragmnet。此时,您的List>eventListLoc数据为空。这就是为什么它会给出NPE

为了避免这种情况,请像这样更改片段代码

public class ListForMonth extends ListFragment {
List<Map<String, String>> eventListLoc;
private int i;

public ListForMonth() {
}

public ListForMonth(int i) {
    this.i = i;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        i = savedInstanceState.getInt("POSITION");
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    eventListLoc = ShowHolder.eventList.get(i);
    setListAdapter(new ShowListAdapter(this.getActivity(), eventListLoc));
    return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("POSITION", i);
}
}
公共类listformon扩展ListFragment{
列出事件列表LOC;
私人互联网i;
公共列表月份(){
}
公共列表月份(国际一){
这个。i=i;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(savedInstanceState!=null){
i=savedInstanceState.getInt(“位置”);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
eventListLoc=ShowHolder.eventList.get(i);
setListAdapter(新的ShowListAdapter(this.getActivity(),eventListLoc));
返回super.onCreateView(充气机、容器、savedInstanceState);
}
@凌驾
SaveInstanceState上的公共无效(束超出状态){
super.onSaveInstanceState(超出状态);
突出。putInt(“位置”,i);
}
}

Logcat:张贴答案检查一下……哦,很好,我不知道getInt和putin。谢谢你的帮助!!
public class ListForMonth extends ListFragment {
List<Map<String, String>> eventListLoc;
private int i;

public ListForMonth() {
}

public ListForMonth(int i) {
    this.i = i;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        i = savedInstanceState.getInt("POSITION");
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    eventListLoc = ShowHolder.eventList.get(i);
    setListAdapter(new ShowListAdapter(this.getActivity(), eventListLoc));
    return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("POSITION", i);
}
}