【问题标题】:Wierd NullPointer Exception in ExpandableListView [duplicate]ExpandableListView 中出现奇怪的空指针异常 [重复]
【发布时间】:2015-12-05 13:23:39
【问题描述】:

所以我正在使用以下适配器制作一个可扩展的 listView:

class SubcategoriesAdapter extends BaseExpandableListAdapter {
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        View v=convertView;
        if(v==null) v=layoutInflater.inflate(R.layout.tip_view, null, false);
        ((TextView)v.findViewById(R.id.title)).setText(data.subcategories.get(groupPosition).tips.get(childPosition).title);
        ((TextView)v.findViewById(R.id.content)).setText(data.subcategories.get(groupPosition).tips.get(childPosition).text);
        return v;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    @Override
    public int getGroupCount() {
        return data.subcategories.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
       return data.subcategories.get(groupPosition).tips.size();
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return data.subcategories.get(groupPosition).tips.get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    @Override
    public Object getGroup(int groupPosition) {
       return data.subcategories.get(groupPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        View v=convertView;
        Tips.TipsSubcategory me=data.subcategories.get(groupPosition);

       if(v==null) v=LayoutInflater.from(getContext()).inflate(R.layout.tips_subcategory_view, null, false);
       /* ((TextView)v.findViewById(R.id.title)).setText(me.title);
        Picasso.with(getActivity()).load(me.ad_url).into(((ImageView) v.findViewById(R.id.adImageView)));
        Picasso.with(getActivity()).load(me.image_url).into((ImageView)v.findViewById(R.id.image)); */
        return v;
    }
}

当我加载包含列表的 Fragment 时,出现以下异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:715)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
    at biz.energit.cookingfridge.user.fragments.TipsCategory$SubcategoriesAdapter.getGroupView(TipsCategory.java:148)

它指向的这条线,148 是我膨胀视图的线:

if(v==null) v=LayoutInflater.from(getContext()).inflate(R.layout.tips_subcategory_view, null, false);

我尝试删除i,传递实际的父代而不是null,并从片段或通过其他方式获取充气器。我一无所知。

更新:以防万一有人再次遇到此问题,我无法写答案,因为有人将其标记为重复。 问题是在我膨胀的 XML 中使用 <view 而不是 <View。编译器对此只字未提,但问题本身就是这样。

【问题讨论】:

  • This is the evil line。您应该使用调试器来了解为什么attrs.getAttributeValue(null, "class"); 返回null

标签: java android expandablelistview expandablelistadapter


【解决方案1】:
  1. 您还没有包含适配器构造函数,您将通过该构造函数将活动/片段上下文传递给适配器,并且在 getGroupView() 和 getChildView() 方法中对视图进行膨胀时将使用相同的上下文。 请包括那个。

【讨论】:

  • 适配器类写在 Fragment 类中。所以我基本上使用的是片段布局充气器,我在 onCreate 期间将其存储在一个实例变量中
【解决方案2】:

让我从我的工作代码中为您提供 sn-p

 public class AccordionAdapter extends BaseExpandableListAdapter {

    private Context mContext = null;
    private LayoutInflater mInflater = null;
    private ArrayList<SearchBean> mDataList = null;

    public AccordionAdapter(Context iContext, ArrayList<SearchBean> iDataList) {
    mContext = iContext;
    mInflater = LayoutInflater.from(mContext);
    mDataList = iDataList;
    }

    @Override
    public Object getChild(int arg0, int arg1) {
    return mDataList.get(arg0).getmChilds().get(arg1);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {

    return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();
    convertView = mInflater.inflate(R.layout.new_child_item, null);
    holder.mTextView = (TextView) convertView
        .findViewById(R.id.new_child_itemtxv);

    holder.mTextView
        .setText(mDataList.get(groupPosition).getmChilds()
            .get(childPosition)[0]
            + " - "
            + mDataList.get(groupPosition).getmChilds()
                .get(childPosition)[1]);
    return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {

    return mDataList.get(groupPosition).getmChilds().size();
    }

    @Override
    public Object getGroup(int groupPosition) {

    return mDataList.get(groupPosition);
    }

    @Override
    public int getGroupCount() {

    return mDataList.size();
    }

    @Override
    public long getGroupId(int groupPosition) {

    return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();
    convertView = mInflater.inflate(R.layout.new_group_item, null);
    holder.mTextView = (TextView) convertView
        .findViewById(R.id.new_grp_itemtxv);
    holder.mTextView.setText(mDataList.get(groupPosition).getmGroup());
    return convertView;
    }

    @Override
    public boolean hasStableIds() {

    return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {

    return true;
    }

    // Data part
    class ViewHolder {
    private TextView mTextView = null;
    }
}

正在使用的模态类

public class SearchBean {
    public String getmGroup() {
        return mGroup;
    }

    public void setmGroup(String mGroup) {
        this.mGroup = mGroup;
    }

    private String mGroup = null;

    public ArrayList<String[]> getmChilds() {
        return mChilds;
    }

    public void setmChilds(ArrayList<String[]> mChilds) {
        this.mChilds = mChilds;
    }

    private ArrayList<String[]> mChilds = null;
}

为 groupview 和 childview 创建两个布局文件,每个文件都有一个 textview。

使用一些虚拟数据创建一个 SearchBean 数组列表。

然后使用这个 AccordionAdapter 将数据设置到可扩展列表视图。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多