在扩展数组适配器时自定义适配器的getView()中的空指针异常

问题描述 投票:0回答:4

我试图显示JSON数据,但它给出了空指针异常。它无法获得我正在膨胀的自定义单项的上下文

public class HotelAdapter extends ArrayAdapter{
    private List<HotelModel> hotelModelList;
    private LayoutInflater layoutInflater;
    private int resource;

    public HotelAdapter(@NonNull Context context, int resource, @NonNull 
List<HotelModel> objects) {
        super(context, resource, objects);
        hotelModelList = objects;
        this.resource=resource;
        layoutInflater = 
(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull 
ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView==null){
            holder =new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.item_hotel,null);

            holder.addr = 
(TextView)convertView.findViewById(R.id.hotel_add_mini);
            holder.categ = 
(TextView)convertView.findViewById(R.id.hotel_rating);
            holder.name = 
(TextView)convertView.findViewById(R.id.hotel_name);
            holder.price = 
(TextView)convertView.findViewById(R.id.hotel_price);
            holder.rating = 
(RatingBar)convertView.findViewById(R.id.ratingBar2);

        }
        else {
            holder= (ViewHolder) convertView.getTag();
        }


        holder.addr.setText(hotelModelList.get(position).getAddr());
        holder.categ.setText(hotelModelList.get(position).getCateg());
        holder.name.setText(hotelModelList.get(position).getName());
        holder.price.setText(Integer.toString(hotelModelList.get(position).getPrice()));
        holder.rating.setRating(hotelModelList.get(position).getRating());


        return convertView;
    }
    class ViewHolder{
        private ImageView img;
        private TextView name;
        private TextView addr;
        private TextView categ;
        private TextView price;
        private RatingBar rating;
    }
}

它无法从item_hotel.xml布局文件中获取TextView的引用。所以它给出了空指针异常。我检查了List <>,列表是非null因此它只是引用问题。而且,在此

holder.addr = 
(TextView)convertView.findViewById(R.id.hotel_add_mini);

(TextView)显示多余,但它不应该具有findViewById返回视图,我们必须将其转换为textView。

android nullpointerexception
4个回答
1
投票

您忘记在if条件中设置标记,并且在其他情况下使用标记是问题所在。

在你的if条件中添加,

convertView.setTag(holder);

2
投票

替换这个:

private List<HotelModel> hotelModelList;
private LayoutInflater layoutInflater;
private int resource;

有:

private List<HotelModel> hotelModelList;
private LayoutInflater layoutInflater;
private int resource;
private Context context;

然后更新你的构造函数而不是这个:

public HotelAdapter(@NonNull Context context, int resource, @NonNull 
List<HotelModel> objects) 
{
    super(context, resource, objects);
    hotelModelList = objects;
    this.resource=resource;
    layoutInflater =
    (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
}

使用以下:

public HotelAdapter(@NonNull Context context, int resource, @NonNull 
List<HotelModel> objects) 
{
    super(context, resource, objects);
    this.hotelModelList = objects;
    this.resource=resource;
    this.context = context;
}

之后,而不是以下行:

convertView = layoutInflater.inflate(R.layout.item_hotel,null);

使用以下两行:

LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(R.layout.item_hotel, parent, false);

删除以下行:

layoutInflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

这将解决您需要为布局inflater提供上下文的问题我认为这可能是您案例中的问题。


0
投票

尝试制作构造函数并设置上下文。

      public class HotelAdapter extends ArrayAdapter{
           Context mcontext;
           private List<HotelModel> mhotelModelList;

           public HotelAdapter(Context context, private List<HotelModel> hotelModelList;){                 
                                super(context, R.layout.item_hotel, hotelModelList);
                                this.mcontext = context;
                                this.mhotelModelList = hotelModelList;
                            }

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
                    LayoutInflater vi = (LayoutInflater) 
                   mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {
                 convertView = mInflater.inflate(R.layout.item_hotel, null);
                 holder = new ViewHolder();
                  holder.addr =(TextView)convertView.findViewById(R.id.hotel_add_mini);         
                 convertView.setTag(holder);
         }

        else{
        holder = (ViewHolder) convertView.getTag();

          holder.addr.setText(hotelModelList.get(position).getAddr());
         return convertView;
     }
   }

0
投票

基本上问题出在这一行

layoutInflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

尝试使用你在HotelAdapter的构造函数中获得的上下文

layoutInflater = (LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);

并在convertView上设置标记

if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_hotel, null);
            holder = new ViewHolder();
            holder.addr = (TextView) convertView.findViewById(R.id.hotel_add_mini);
            holder.categ = (TextView) convertView.findViewById(R.id.hotel_rating);
            holder.name = (TextView) convertView.findViewById(R.id.hotel_name);
            holder.price = (TextView) convertView.findViewById(R.id.hotel_price);
            holder.rating = (RatingBar) convertView.findViewById(R.id.ratingBar2);
            convertView.setTag(holder);
        } else{
            holder= (ViewHolder) convertView.getTag();
        }
© www.soinside.com 2019 - 2024. All rights reserved.