简体   繁体   中英

xamarin android ExpandableListView: remove or hide a childview from group

How to remove a child view from group after clicking a button of the child view?

class ExpandableListAdapter : BaseExpandableListAdapter {

    private ListView listview;
    private LinearLayout mainLayout;
    private View linearLayout;

    public Activity _context;

    TextView txtListChild;

    private List<string> _listDataHeader; // header titles
    private Dictionary<string, List<string>> _listDataChild;

    public ExpandableListAdapter(Activity activity, List<string> listDataHeader, Dictionary<String, List<string>> listChildData) {
        //, Dictionary<String, List<string>> listChildData2
        this._context = activity;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
        // this._listDataChild2 = listChildData2;
    }


    public override Java.Lang.Object GetChild(int groupPosition, int childPosition) {
        return _listDataChild[_listDataHeader[groupPosition]][childPosition];
    }


    public override long GetChildId(int groupPosition, int childPosition) {
        return childPosition;
    }



    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) {
        string childText = (string)GetChild(groupPosition, childPosition);
        convertView = null;

        if (convertView == null) {
            convertView = _context.LayoutInflater.Inflate(Resource.Layout.childRowWithButton, null);

            Button no = (Button)convertView.FindViewById(Resource.Id.gono);

            no.Click += delegate{
                // I want hide my child
            };

            txtListChild.Text = childText;
        }
        return convertView;
    }

    public override int GetChildrenCount(int groupPosition) {
        return _listDataChild[_listDataHeader[groupPosition]].Count;
    }

    public override Java.Lang.Object GetGroup(int groupPosition) {
        return _listDataHeader[groupPosition];
    }


    public override long GetGroupId(int groupPosition){
        return groupPosition;
    }


    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent){
        string headerTitle = (string)GetGroup(groupPosition);

        convertView = convertView ? ? _context.LayoutInflater.Inflate(Resource.Layout.HeaderCustomLayout, null);
        var lblListHeader = (TextView)convertView.FindViewById(Resource.Id.Header);

        //string headerTitle2 = (string)GetGroup(groupPosition);
        //var ListHeader2 = (TextView)convertView.FindViewById(Resource.Id.Header2);
        //ListHeader2.Text = headerTitle2;

        lblListHeader.Text = headerTitle;

        return convertView;
    }


    public override int GroupCount{
        get{
            return _listDataHeader.Count;
        }
    }


    public override bool HasStableIds{
        get{
            return false;
        }
    }


    public override bool IsChildSelectable(int groupPosition, int childPosition){
        return true;
    }
}

You can use listView.SetOnChildClickListener() to remove your child view as following code:

public class MainActivity : Activity , IOnChildClickListener
    {
        ExpandableListView listView;
        List<Data> newDataList;
        ExpandableDataAdapter myadapter;
        public bool OnChildClick(ExpandableListView parent, View clickedView, int groupPosition, int childPosition, long id)
        {     
            newDataList.RemoveAt(0);
            myadapter.NotifyDataSetChanged();
            return true;
        }

        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            SetContentView (Resource.Layout.Main);       
            newDataList = Data.SampleData();
            myadapter = new ExpandableDataAdapter(this, newDataList);
            listView = FindViewById<ExpandableListView> (Resource.Id.myExpandableListview);
            listView.SetAdapter (myadapter);
            listView.SetOnChildClickListener(this);


        }
    }

In my sample, I just remove the first item of the child, You can use the int groupPosition, int childPosition to get the current location you click. And remove it from your listData . Remember to call adapter.NotifyDataSetChanged(); when you change the data set.

I am using the ExpandableListView sample from github

Screen shot:

在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM