Java 自定义Listview中LayoutFlater中的空指针异常
我是android的初学者。我得到了NullPointerReception错误 我希望我的活动得到我的listview和每个listview包含图像,它;它的标题和描述, 我读了这篇文章 我无法正确理解MainActivity.java LayoutInflater中的上下文发生了什么 我使用了基本适配器而不是ArrayAdapter 请帮忙。。提前谢谢 这里我放了一些代码 一个图像视图,两个文本视图 CustomeList.xmlJava 自定义Listview中LayoutFlater中的空指针异常,java,android,android-listview,baseadapter,Java,Android,Android Listview,Baseadapter,我是android的初学者。我得到了NullPointerReception错误 我希望我的活动得到我的listview和每个listview包含图像,它;它的标题和描述, 我读了这篇文章 我无法正确理解MainActivity.java LayoutInflater中的上下文发生了什么 我使用了基本适配器而不是ArrayAdapter 请帮忙。。提前谢谢 这里我放了一些代码 一个图像视图,两个文本视图 CustomeList.xml <?xml version="1.0" encodin
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignParentRight="true"
android:layout_toRightOf="@+id/imageView1"
android:text="Descript1" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/img2" />
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Title1"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
上下文变量被引用为null 在构造函数中,您没有使用参数Context c 添加这行代码
context=c;
您正在使用getView()
方法中的上下文,该方法也会导致空指针
在自定义适配器中,getView()
返回触发空指针异常的null
。您需要返回膨胀的视图
替换
return null;
与
您没有正确使用“上下文”值。这就是你得到的错误。同时返回视图。 下面的代码将帮助您。您还可以使用ViewHolder模式,这将提高代码效率 公共类MyBaseAdapter扩展了BaseAdapter{
ArrayList<ListData> myList = new ArrayList<ListData>();
LayoutInflater inflater;
Context context;
public MyBaseAdapter(Context context, ArrayList<ListData> myList) {
this.myList = myList;
this.context = context;
inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return myList.size();
}
@Override
public ListData getItem(int position) {
return myList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.layout_list_item, parent, false);
mViewHolder = new MyViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
ListData currentListData = getItem(position);
mViewHolder.tvTitle.setText(currentListData.getTitle());
mViewHolder.tvDesc.setText(currentListData.getDescription());
mViewHolder.ivIcon.setImageResource(currentListData.getImgResId());
return convertView;
}
private class MyViewHolder {
TextView tvTitle, tvDesc;
ImageView ivIcon;
public MyViewHolder(View item) {
tvTitle = (TextView) item.findViewById(R.id.tvTitle);
tvDesc = (TextView) item.findViewById(R.id.tvDesc);
ivIcon = (ImageView) item.findViewById(R.id.ivIcon);
}
}
ArrayList myList=new ArrayList();
充气机;
语境;
公共MyBaseAdapter(上下文,ArrayList myList){
this.myList=myList;
this.context=上下文;
充气器=从(此上下文)开始的充气器;
}
@凌驾
public int getCount(){
返回myList.size();
}
@凌驾
public ListData getItem(int位置){
返回myList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
MyViewHolder mViewHolder;
if(convertView==null){
convertView=充气机。充气(R.layout.layout\u list\u项,父项,false);
mViewHolder=新的MyViewHolder(convertView);
setTag(mViewHolder);
}否则{
mViewHolder=(MyViewHolder)convertView.getTag();
}
ListData currentListData=getItem(位置);
mViewHolder.tvTitle.setText(currentListData.getTitle());
mviewolder.tvDesc.setText(currentListData.getDescription());
mViewHolder.ivIcon.setImageResource(currentListData.getImgResId());
返回视图;
}
私有类MyViewHolder{
文本视图tvTitle,tvDesc;
ImageView-ivIcon;
公共MyViewHolder(视图项){
tvTitle=(TextView)item.findViewById(R.id.tvTitle);
tvDesc=(TextView)item.findViewById(R.id.tvDesc);
ivIcon=(ImageView)item.findViewById(R.id.ivIcon);
}
}
您还可以建议他改进hit-getView方法,应用ViewHolder模式,避免每次调用getView时膨胀一个新视图,yes@blackbelt,并避免调用indViewById()在您的构造函数上,您没有将上下文设置为c。我认为您错过了此部分context=c;请检查您的变量。上下文变量导致空指针,因为您正在getView()中使用它methodoops,我忘了..谢谢,错误消失..谢谢用户3818605,,我将编辑我的答案,这样你就可以接受它,因为它解决了你的问题。你在活动java文件中定义了所有这些类吗?这是一个非常糟糕的主意。我发布了一个带有图像和文本的正确自定义列表视图的示例实现,你可以看看这个开始吧,非常感谢Droidman。我对ArrayAdapter和BaseAdapter有一个困惑。你能给我一个合适的文档或链接吗?我看到了很多东西,但我感到困惑…哪一个更好?它们有不同的用途。简单地说:BaseAdapter
是一个可以使用的工具,如果你有更复杂的自定义ListView
或GridView
context=c;
return null;
return row;
ArrayList<ListData> myList = new ArrayList<ListData>();
LayoutInflater inflater;
Context context;
public MyBaseAdapter(Context context, ArrayList<ListData> myList) {
this.myList = myList;
this.context = context;
inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return myList.size();
}
@Override
public ListData getItem(int position) {
return myList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.layout_list_item, parent, false);
mViewHolder = new MyViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
ListData currentListData = getItem(position);
mViewHolder.tvTitle.setText(currentListData.getTitle());
mViewHolder.tvDesc.setText(currentListData.getDescription());
mViewHolder.ivIcon.setImageResource(currentListData.getImgResId());
return convertView;
}
private class MyViewHolder {
TextView tvTitle, tvDesc;
ImageView ivIcon;
public MyViewHolder(View item) {
tvTitle = (TextView) item.findViewById(R.id.tvTitle);
tvDesc = (TextView) item.findViewById(R.id.tvDesc);
ivIcon = (ImageView) item.findViewById(R.id.ivIcon);
}
}