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