'How can we add an ExpandableListView inside a popupwindow in android?

I am creating a sample android application in which an ExpandableListView is shown on the left side when the application is in Landscape mode. But when the application runs in portrait mode the ExpandableListView must shown as a PopupWindow when the showpopup button is clicked. How can we add an ExpandableListView inside a PopupWindow in Android?

I did some initial Research with popupwindow and ExpandableListView. This is the code I tried (for the portrait mode)

public class LoginActivity extends Activity
{

private Button                     btnShowPopUp;
private PopupWindow                mpopup;

ExpandableListAdapter              adapter;

private ExpandListAdapter          ExpAdapter;
private ArrayList<ExpandListGroup>  ExpListItems;
private ExpandableListView         ExpandList;

@Override
public void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    try
    {
        btnShowPopUp = (Button) findViewById(R.id.btnShowPopUp);

        btnShowPopUp.setOnClickListener(new OnClickListener()
        {
            public void onClick (View arg0)
            {
                    PopupwithExpndLst();
                //PopupwithBtn();

            }
        });
    }
    catch (Exception ex)
    {
        Log.i("Test", "Error is " + ex.getMessage());
    }

}

public void PopupwithExpndLst ()
{
    try
    {
         View popUpView = getLayoutInflater().inflate(R.layout.explist, null); // inflating popup layout

        mpopup = new PopupWindow(popUpView, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, true); // Creation of popup
        mpopup.setAnimationStyle(android.R.style.Animation_Dialog);
        mpopup.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); // Displaying popup

        ExpandList = (ExpandableListView) findViewById(R.id.lstExpList);
        adapter = new MyExpandableListAdapter(this);
        ExpandList.setAdapter(adapter);


    }
    catch (Exception ex)
    {
        Log.i("Test", "Error is " + ex.getMessage());
    }
}


public void PopupwithBtn ()
{
    View popUpView = getLayoutInflater().inflate(R.layout.popup, null); // inflating popup layout
    mpopup = new PopupWindow(popUpView, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, true); // Creation of popup
    mpopup.setAnimationStyle(android.R.style.Animation_Dialog);
    mpopup.showAtLocation(popUpView, Gravity.BOTTOM, 0, 0); // Displaying popup

    ExpandList = (ExpandableListView) findViewById(R.id.lstExpList);
    adapter = new MyExpandableListAdapter(this);
    ExpandList.setAdapter(adapter);

    Button btnOk = (Button) popUpView.findViewById(R.id.btnOk);
    btnOk.setOnClickListener(new OnClickListener()
    {
        public void onClick (View v)
        {
            mpopup.dismiss(); // dismissing the popup
        }
    });

    Button btnCancel = (Button) popUpView.findViewById(R.id.btnCancel);
    btnCancel.setOnClickListener(new OnClickListener()
    {
        public void onClick (View v)
        {
            mpopup.dismiss(); // dismissing the popup
        }
    });
}

public ArrayList<ExpandListGroup> SetStandardGroups ()
{
    ArrayList<ExpandListGroup> list = new ArrayList<ExpandListGroup>();
    ArrayList<ExpandListChild> list2 = new ArrayList<ExpandListChild>();
    ExpandListGroup gru1 = new ExpandListGroup();
    gru1.setName("Comedy");
    ExpandListChild ch1_1 = new ExpandListChild();
    ch1_1.setName("A movie");
    ch1_1.setTag(null);
    list2.add(ch1_1);
    ExpandListChild ch1_2 = new ExpandListChild();
    ch1_2.setName("An other movie");
    ch1_2.setTag(null);
    list2.add(ch1_2);
    ExpandListChild ch1_3 = new ExpandListChild();
    ch1_3.setName("And an other movie");
    ch1_3.setTag(null);
    list2.add(ch1_3);
    gru1.setItems(list2);
    list2 = new ArrayList<ExpandListChild>();

    ExpandListGroup gru2 = new ExpandListGroup();
    gru2.setName("Action");
    ExpandListChild ch2_1 = new ExpandListChild();
    ch2_1.setName("A movie");
    ch2_1.setTag(null);
    list2.add(ch2_1);
    ExpandListChild ch2_2 = new ExpandListChild();
    ch2_2.setName("An other movie");
    ch2_2.setTag(null);
    list2.add(ch2_2);
    ExpandListChild ch2_3 = new ExpandListChild();
    ch2_3.setName("And an other movie");
    ch2_3.setTag(null);
    list2.add(ch2_3);
    gru2.setItems(list2);
    list.add(gru1);
    list.add(gru2);

    return list;
}

@Override
public boolean onCreateOptionsMenu (Menu menu)
{
    getMenuInflater().inflate(R.menu.activity_login, menu);
    return true;
}

}

My ActivityLogin.xml is

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

<Button
    android:id="@+id/btnShowPopUp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ShowPopUp" >
</Button>

</LinearLayout>

My explist.xml is

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#90FFFFFF"
android:orientation="vertical" >

<TextView
    android:id="@+id/txtEmpty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="No items" />

<ExpandableListView
    android:id="@+id/lstExpList"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:groupIndicator="@null" />

and popup.xml is

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#90FFFFFF"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="PopUp Window"
    android:textColor="#000000"
    android:textStyle="bold" >
</TextView>

<Button
    android:id="@+id/btnOk"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Ok" >
</Button>

<Button
    android:id="@+id/btnCancel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Cancel" >
</Button>

my ExpendableListAdapter.java is

    public class ExpandListAdapter extends BaseExpandableListAdapter
    {

private Context                    context;
private ArrayList<ExpandListGroup>  groups;

public ExpandListAdapter(Context context, ArrayList<ExpandListGroup> groups)
{
    try
    {

        this.context = context;
        this.groups = groups;

    }
    catch (Exception ex)
    {
        Log.i("Test", "Error is " + ex.getMessage());
    }
}

public void addItem (ExpandListChild item, ExpandListGroup group)
{
    if (!groups.contains(group))
    {
        groups.add(group);
    }
    int index = groups.indexOf(group);
    ArrayList<ExpandListChild> ch = groups.get(index).getItems();
    ch.add(item);
    groups.get(index).setItems(ch);
}

public Object getChild (int groupPosition, int childPosition)
{
    ArrayList<ExpandListChild> chList = groups.get(groupPosition).getItems();
    return chList.get(childPosition);
}

public long getChildId (int groupPosition, int childPosition)
{

    return childPosition;
}

public View getChildView (int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent)
{
    ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);
    if (view == null)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        view = inflater.inflate(R.layout.expandlist_child_item, null);
    }
    TextView tv = (TextView) view.findViewById(R.id.tvChild);
    tv.setText(child.getName().toString());
    tv.setTag(child.getTag());

    return view;
}

public int getChildrenCount (int groupPosition)
{
    // TODO Auto-generated method stub
    ArrayList<ExpandListChild> chList = groups.get(groupPosition).getItems();
    return chList.size();
}

public Object getGroup (int groupPosition)
{
    // TODO Auto-generated method stub

    return groups.get(groupPosition);
}

public int getGroupCount ()
{
    // TODO Auto-generated method stub
    return groups.size();
}

public long getGroupId (int groupPosition)
{
    // TODO Auto-generated method stub
    return groupPosition;
}

public View getGroupView (int groupPosition, boolean isLastChild, View view, ViewGroup parent)
{
    // TODO Auto-generated method stub
    ExpandListGroup group = (ExpandListGroup) getGroup(groupPosition);
    if (view == null)
    {
        LayoutInflater inf = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        view = inf.inflate(R.layout.expamdlist_group_item, null);

    }
    TextView tv = (TextView) view.findViewById(R.id.tvGroup);
    tv.setText(group.getName());
    return view;
}

public boolean hasStableIds ()
{
    // TODO Auto-generated method stub
    return true;
}

public boolean isChildSelectable (int groupPosition, int childPosition)
{
    // TODO Auto-generated method stub
    return true;
}

}

In the LoginActivity class, if I use PopupwithBtn() function inside onclick method of btnShowpopup, the popup is working as expected but when i use PopupwithExpndLst().

In PopupwithExpndLst() method when i try to set the adapter for the expendable list its showing null pointer exception. Please help me to solve the issue.

Thanks in advance Bimzee



Solution 1:[1]

Ok i Just figured out the problem

I must have used

    (ExpandableListView) mpopup.getContentView().findViewById(R.id.lstExpList)

instead of

    (ExpandableListView)findViewById(R.id.lstExpList)

inside PopupwithExpndLst() method

Hope this will be helpful to some one

Thank you

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bimzee