3

The expandable listview is proper but it doesnt get refreshed when again called. Old Items are again seen in the expandable list view. This is my adapter class. How do i refresh items in expab=ndable listview ?

MyAdapter.class

public class MyAdapter extends BaseExpandableListAdapter {
 private Context _context;
    private static List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private static  HashMap<String, List<String>> _listDataChild;

    public MyAdapter(Context context, List<String> listDataHeader,HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }
    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosititon);
    }

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

    @Override
    public View getChildView(int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

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

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

}
Rob
  • 4,927
  • 4
  • 26
  • 41
Vinit Khanna
  • 81
  • 1
  • 1
  • 10

4 Answers4

12

Add this method to MyAdapter and use it:

public void setNewItems(List<String> listDataHeader,HashMap<String, List<String>> listChildData) {
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
    notifyDataSetChanged();
 }
Rob
  • 4,927
  • 4
  • 26
  • 41
Piotr Golinski
  • 990
  • 8
  • 19
2

You should call this function outside the adapter to suit your needs. In the main class you can call this after onClick, or onExpand.

adapter.notifyDataSetChanged();

Should do it.

Gustavo Morales
  • 2,614
  • 9
  • 29
  • 37
Alp Altunel
  • 3,324
  • 1
  • 26
  • 27
1

listView.invalidateViews() can also help here

IntelliJ Amiya
  • 74,896
  • 15
  • 165
  • 198
amodkanthe
  • 4,345
  • 6
  • 36
  • 77
0

Needs to be done inside adapter

suppose we need to refresh expandable list after an item click from header , then inside on item click listener. Just clear the item from child hash map using key, and then clear item from header array list, and then notify data set changed.

childList.remove(parentList.get(groupPosition));
parentList.remove(parentList.get(groupPosition));
notifyDataSetChanged();
Community
  • 1
  • 1