【问题标题】:Null Pointer Exception in getView() of custom adapter while extending array adapter扩展数组适配器时自定义适配器的 getView() 中的空指针异常
【发布时间】:2017-12-19 19:25:52
【问题描述】:

我正在尝试显示 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 布局文件中获取 TextViews 的引用。所以它给出了空指针异常。我检查了 List,该列表是非空的,所以它只是参考问题。而且,在这个

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

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

【问题讨论】:

  • 从 API 26 开始,findViewById 对其返回类型使用推理,因此您不再需要强制转换。它的返回类型是&lt;T extends View&gt; T 而不是View

标签: android nullpointerexception


【解决方案1】:

替换这个:

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);

这将解决您需要为布局充气器提供上下文的问题,我认为这可能是您的问题。

【讨论】:

  • 应用上面提到的更改它会起作用让我知道以获得进一步的帮助。祝你好运哥们:)
  • 哦,哥们,你没有在你的适配器中设置上下文,你需要升级你的构造函数并创建一个类 Context 的 cariable 上下文。我会在 2 分钟内更新我的答案检查,那样你会很高兴的。
  • 在调用此适配器时还有另一件事是错误的,您还必须传递您的酒店列表。我也会更新的。
  • 所有设置现在尝试我提到的更改。这现在可以工作了:)。快乐编码:)
  • 让我知道它是否有效,如果您需要进一步的帮助,请告诉我。
【解决方案2】:

您忘记在 if 条件中设置标签,而您在 else 条件下使用标签是问题所在。

在你的 if 条件下添加,

convertView.setTag(holder);

【讨论】:

  • 是的,有效。但列表视图只显示一个结果
【解决方案3】:

尝试创建一个构造函数并设置上下文。

      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;
     }
   }

【讨论】:

  • 解释一下,这样同行就能得到你写的一些概念
  • 是的,当然@Waleed Asim
【解决方案4】:

基本上问题出在这一行

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();
        }

【讨论】:

  • 发布您正在充气和记录的项目布局
  • java.lang.NullPointerException:尝试从空对象引用上的“android.widget.TextView com.bt4u.shopcite.hotel_populate_list$HotelAdapter$ViewHolder.addr”字段读取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多