Adapter中常见遇到的NullPointerException

来源:互联网 发布:光能使者知乎 编辑:程序博客网 时间:2024/06/07 15:21
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 referenceat 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 referenceat 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) 


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


0 0
原创粉丝点击