Vinit Khanna
Vinit Khanna

Reputation: 81

Refresh Expandable Listview

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

}

Upvotes: 3

Views: 10315

Answers (4)

Priyavrat Talyan
Priyavrat Talyan

Reputation: 121

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

Upvotes: 0

amodkanthe
amodkanthe

Reputation: 4530

listView.invalidateViews() can also help here

Upvotes: 1

Alp Altunel
Alp Altunel

Reputation: 3443

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.

Upvotes: 2

Piotr Golinski
Piotr Golinski

Reputation: 1000

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

Upvotes: 12

Related Questions