1

So I'm making an expandable listView with the following adapter:

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

When I'm loading this Fragment that contains the list, I get the following exception:

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)

This line that it's pointing to, 148 is the line where I inflate the view:

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

I tried removing the i, passing the actual parent instead of null, and getting the inflater from the fragment or via other means. I'm clueless.

UPDATE: Just in case someone has this issue again, I can't write an answer because someone marked this a duplicate. The problem was using <view instead of <View in the XML I was inflating. The compiler says nothing about it, but the issue mafiests itself this way.

Tom
  • 16,842
  • 17
  • 45
  • 54
Leo Starić
  • 331
  • 1
  • 4
  • 16
  • [This is the evil line](http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/5.0.0_r2-robolectric-1/android/view/LayoutInflater.java#715). You should use a debugger to know why `attrs.getAttributeValue(null, "class");` returns `null`. – Tom Dec 05 '15 at 14:31

2 Answers2

1
  1. You haven't included your adapter constructor, through which you will be passing the activity/fragment context to adapter and you will be using the same context when Inflating a view inside getGroupView() and getChildView() method. Please include that.
HourGlass
  • 1,805
  • 1
  • 15
  • 29
  • The adapter class is writtien within the Fragment class. So I'm basically using the fragments layout inflater, which I store in an instance variable during onCreate – Leo Starić Dec 05 '15 at 14:29
1

Let me provide you snippet from my working code

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

Modal class being used

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

Create two layout files for groupview and childview with single textview in each.

Create an arraylist of SearchBean with some dummy data.

then use this AccordionAdapter to set data to the expandablelistview .

Hope it helps.

Napolean
  • 5,303
  • 2
  • 29
  • 35