Adapter中常见遇到的NullPointerException

Adapter原代码
private class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return icons.length;
        }

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

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView= View.inflate(getApplicationContext(), R.layout.item_main, null);
            //获取组件
            ImageView image = (ImageView) findViewById(R.id.iv_grid);
            TextView text = (TextView) findViewById(R.id.tv_grid);
 layout.findViewById(R.id.tv_grid);


            image.setImageResource(icons[position]);
            text.setText(names[position]);

            return convertView;
        }
    }

item_main.xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center_horizontal"
              tools:ignore="UseCompoundDrawables">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv_grid"
        android:src="@drawable/app"
        tools:ignore="ContentDescription"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_grid"
        android:text="@string/ruanjiang"
        android:textSize="15sp"
        android:textColor="#000000"/>

</LinearLayout>

error:

Process: com.example.safeapp, PID: 24231
                                                                     java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
at com.example.safeapp.MainActivity$MyAdapter.getView(MainActivity.java:76)
at android.widget.AbsListView.obtainView(AbsListView.java:2365)
at android.widget.GridView.onMeasure(GridView.java:1060)
at android.view.View.measure(View.java:17565)
...

分析:

调用'void android.widget.ImageView.setImageResource(int)'时遇到了空对象引用,往下看,嗯,发生在MainActivity内部类MyAdapter.getView方法中,双击(MainActivity.java:76)游标调到MainActivity.java的第76行,为:

image.setImageResource(icons[position]);

很容易可以知道是控件没找到,item_main.xml没有错误,可能是findViewById()处发生了错误

第一次更改:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView= View.inflate(getApplicationContext(), R.layout.item_main, null);
            //获取组件
            ImageView image = (ImageView) convertView.findViewById(R.id.iv_grid);
            TextView text = (TextView) convertView.findViewById(R.id.tv_grid);

            image.setImageResource(icons[position]);
            text.setText(names[position]);

            return convertView;
        }

运行:

Process: com.example.safeapp, PID: 616
                                                                 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
at android.widget.AbsListView.obtainView(AbsListView.java:2381)
at android.widget.GridView.onMeasure(GridView.java:1060)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5545)
...

分析:

调用'int android.view.View.getImportantForAccessibility()'时遇到了空对象引用,这个方法是判断view对无障碍的重要性,它遇到了空对象引用,就是说此view==null。好吧,加载view时可能遇到问题了。

再次更改之后:

 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
//            //空指针异常
//            convertView= View.inflate(getApplicationContext(), R.layout.item_main, null);

            LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
            convertView= (LinearLayout) inflater.inflate(R.layout.item_main, null);

            ImageView image = (ImageView) convertView.findViewById(R.id.iv_grid);
            TextView text = (TextView) convertView.findViewById(R.id.tv_grid);


            image.setImageResource(icons[position]);
            text.setText(names[position]);

            return convertView;
        }
    }
运行通过。
总结:

  • View.inflate():找出 res/layout 下的 xml 布局文件填充到父布局,并且实例化,此时,仅仅在内存中创建了这个对象而已,在界面上不会显示出来这个对象
  • setContentView():显示出xml布局的界面
  • LayoutInflater():动态载入xml布局的界面 参考: Android LayoutInflater详解http://www.cnblogs.com/top5/archive/2012/05/04/2482328.html

  • findViewById():根据id获取布局文件中的布局和空间,只要使用android:id=”“属性的都可以使用此方法获取。默认是在主xml布局文件中查找,如果要动态加载的布局文件,则要在使用: 
    声明的布局名.findViewById(R.id.tv_grid) 


如果您认为对你有所帮助,请扫一下,会记忆更牢靠哦


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值