Android ListView NullPointerException

youxunlong 2017-01-12 12:10:49
我想要创建一个ListView显示Android系统中所有的APP
下面是正确的代码(已验证)


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.item_app, null);
holder.drawable = (ImageView) convertView.findViewById(R.id.iv_app);
holder.name = (TextView) convertView.findViewById(R.id.tv_appName);
holder.isRom = (TextView) convertView.findViewById(R.id.tv_isRom);
holder.size = (TextView) convertView.findViewById(R.id.tv_appSize);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}

AppInfo appInfo = null;
//line4
// if(position==userList.size()){
// TextView tv = new TextView(context);
// tv.setText("系统jjjjjjjjjjjjjjjjjjjjjjjjj");
// return tv;
// }
if(position>=0 && position<userList.size()){
appInfo = userList.get(position);
//exchange line2
// }else if(position>userList.size() && position<getCount()){
}else if(position>=userList.size() && position<getCount()){
//exchange line3
// appInfo = systemList.get(position-userList.size()-1);
appInfo = systemList.get(position-userList.size());
}
holder.drawable.setImageDrawable(appInfo.icon);
holder.name.setText(appInfo.appName);
if(appInfo.isInRom){
holder.isRom.setText("手机内存");
}else{
holder.isRom.setText("SD卡内存");
}
String size = Formatter.formatFileSize(context, appInfo.appSize);
holder.size.setText(size);


return convertView;
}

class ViewHolder{
ImageView drawable;
TextView name;
TextView isRom;
TextView size;
}


运行结果如下

然后我换了line1,line2,line3,取消注释line4,实现代码如下:


@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.item_app, null);
holder.drawable = (ImageView) convertView.findViewById(R.id.iv_app);
holder.name = (TextView) convertView.findViewById(R.id.tv_appName);
holder.isRom = (TextView) convertView.findViewById(R.id.tv_isRom);
holder.size = (TextView) convertView.findViewById(R.id.tv_appSize);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}

AppInfo appInfo = null;
//line4
if(position==userList.size()){
TextView tv = new TextView(context);
tv.setText("系统jjjjjjjjjjjjjjjjjjjjjjjjj");
return tv;
}
if(position>=0 && position<userList.size()){
appInfo = userList.get(position);
//exchange line2
}else if(position>userList.size() && position<getCount()){
// }else if(position>=userList.size() && position<getCount()){
//exchange line3
appInfo = systemList.get(position-userList.size()-1);
// appInfo = systemList.get(position-userList.size());
}
holder.drawable.setImageDrawable(appInfo.icon);
holder.name.setText(appInfo.appName);
if(appInfo.isInRom){
holder.isRom.setText("手机内存");
}else{
holder.isRom.setText("SD卡内存");
}
String size = Formatter.formatFileSize(context, appInfo.appSize);
holder.size.setText(size);


return convertView;
}

class ViewHolder{
ImageView drawable;
TextView name;
TextView isRom;
TextView size;
}


运行结果如下,ListView中有一个TextView对象

程序运行了,然后我滑动ListView,当TExtView消失时,软件就奔溃了



01-11 09:46:41.046: D/AndroidRuntime(6132): Shutting down VM
01-11 09:46:41.046: W/dalvikvm(6132): threadid=1: thread exiting with uncaught exception (group=0xa4ce2b20)
01-11 09:46:41.046: E/AndroidRuntime(6132): FATAL EXCEPTION: main
01-11 09:46:41.046: E/AndroidRuntime(6132): Process: com.xunlong.softwaremanagermodule, PID: 6132
01-11 09:46:41.046: E/AndroidRuntime(6132): java.lang.NullPointerException
01-11 09:46:41.046: E/AndroidRuntime(6132): at com.xunlong.softwaremanagermodule.AppAdapter.getView(AppAdapter.java:77)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.ListView.makeAndAddView(ListView.java:1790)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.ListView.fillDown(ListView.java:691)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.ListView.fillGap(ListView.java:655)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5143)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3243)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.AbsListView.onTouchMove(AbsListView.java:3587)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3431)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.view.View.dispatchTouchEvent(View.java:7706)
01-11 09:46:41.046: E/AndroidRuntime(6132): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
...全文
169 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒冰大神 2017-01-12
  • 打赏
  • 举报
回复
把 if(position==userList.size()){ TextView tv = new TextView(context); tv.setText("系统jjjjjjjjjjjjjjjjjjjjjjjjj"); return tv; } 放到 if(convertView==null){ 前面 试试。
寒冰大神 2017-01-12
  • 打赏
  • 举报
回复
错误在 77 行啊,77行是哪行?, 你getCount() 是多少?
YXTS122 2017-01-12
  • 打赏
  • 举报
回复
把TextView声明为全局变量看看怎么样。。

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧