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)