Android List Adapter空指针异常求助:调用String.equals时出现空对象引用
解决你的Android ListAdapter空指针异常问题
嘿,我发现你遇到的java.lang.NullPointerException和Binary XML错误,根源其实在你的布局文件里一个很容易忽略的拼写错误!
问题定位
你在list_item.xml里写了一个小写的<view>标签:
<view android:layout_width="match_parent" android:layout_height="2dp" android:background="@android:color/background_light" android:layout_below="@+id/movieImage"> </view>
Android布局系统里,原生的视图组件标签是大写开头的<View>,小写的<view>会被系统识别为自定义视图类,而你并没有定义这个类,所以inflater.inflate()会返回null。当后续代码尝试对null的row进行操作(甚至系统内部的视图绑定逻辑),就会触发空指针异常,也就是你看到的Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference。
修复步骤
- 修正布局文件的标签拼写
把list_item.xml里的<view>和</view>改成<View>和</View>,顺便改成自闭合标签更规范:
<View android:layout_width="match_parent" android:layout_height="2dp" android:background="@android:color/background_light" android:layout_below="@+id/movieImage" />
- 优化你的Adapter代码(可选但推荐)
你的MovieAdapter没有使用泛型,还维护了两份数据源(super的数据源和自己的list),容易出现类型转换和数据不一致问题。可以改成更简洁的泛型版本:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class MovieAdapter extends ArrayAdapter<MovieDataProvider> { public MovieAdapter(Context context, List<MovieDataProvider> data) { super(context, R.layout.list_item, data); } static class DataHandler{ ImageView poster; TextView title; TextView rating; } @Override public View getView(int position, View row, ViewGroup parent){ DataHandler handler; MovieDataProvider dataProvider = getItem(position); if (row == null) { handler = new DataHandler(); LayoutInflater inflater = LayoutInflater.from(getContext()); row = inflater.inflate(R.layout.list_item, parent, false); handler.poster = row.findViewById(R.id.movieImage); handler.title = row.findViewById(R.id.movieTitle); handler.rating = row.findViewById(R.id.movieRating); row.setTag(handler); } else { handler = (DataHandler) row.getTag(); } // 增加null判断,避免数据源为空时崩溃 if(dataProvider != null){ handler.poster.setImageResource(dataProvider.getMovie_poster()); handler.title.setText(dataProvider.getMovie_title()); handler.rating.setText(dataProvider.getMovie_rating()); } return row; } }
额外提示
- 以后遇到布局相关的空指针异常,优先检查布局文件的标签拼写、ID是否正确,有没有引用不存在的资源。
- 在
getView里对数据源对象加null判断,能进一步提升代码的健壮性。
内容的提问来源于stack exchange,提问作者Mohammad Sufian Al-Omar
相关产品推荐
相关产品推荐

