【问题标题】:Checkbox checked list item - Xamarin android复选框选中的列表项 - Xamarin android
【发布时间】:2019-09-21 23:51:29
【问题描述】:

我是 Android 新手。我有一个列表视图,其中包含每个列表项中的复选框。我在列表视图下有一个按钮。在按钮单击事件上,我必须捕获选中复选框的所有列表视图项目。

这是我的适配器代码。

  class ListAdapter : BaseAdapter<Package>
    {
        List<Package> routeSheet;
        Activity activity;
        public ListAdapter(Activity activity, List<Package> routeSheetRequests)
        {
            this.activity = activity;
            this.routeSheet = routeSheetRequests;
        }

        public override Package this[int position]
        {
            get
            {
                return routeSheet[position];
            }
        }
        public override Java.Lang.Object GetItem(int position)
        {
            return position;
        }

        public override long GetItemId(int position)
        {
            return position;
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            var view = convertView;


            if (view == null)
            {
                view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.CheckoutListRow, 
    parent, false);

                var stopId = view.FindViewById<TextView>(Resource.Id.txtStopId);
                var shipperName = view.FindViewById<TextView>(Resource.Id.txtShipperName);
                var checkBoxMove = view.FindViewById<CheckBox>(Resource.Id.chkCheckout);
                checkBoxMove.CheckedChange += CheckBoxMove_CheckedChange;

                view.Tag = new ListAdapterViewHolder() { StopId = stopId, DeliveryCompany = shipperName, 
            CheckBox = checkBoxMove };
            }
            else
            {

            }
            var holder = (ListAdapterViewHolder)view.Tag;

            holder.StopId.Text = Convert.ToString(routeSheet[position].ControlNumber);
            holder.DeliveryCompany.Text = Convert.ToString(routeSheet[position].DeliveryCompany);

            return view;
        }


        private void CheckBox_CheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            if (e.IsChecked)
            {
             // Here I want to get the list item details
            }

        }

        public override int Count
        {
            get
            {
                if (routeSheet != null)
                    return routeSheet.Count();
                else
                    return 0;
            }
        }
    }

    class ListAdapterViewHolder : Java.Lang.Object
    {

        public TextView DeliveryCompany { get; set; }
        public TextView StopId { get; set; }
        public CheckBox CheckBox { get; set; }
    }

这是我的片段代码。

public class CheckoutExcFragment : Android.Support.V4.App.Fragment
    {
        ListView ExcList;
        private List<Package> routesheet = null;

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Package package;
            routesheet = new List<Package>();

                var Packages = Arguments.GetParcelableArrayList("PakageList");
                if (Packages != null)
                {
                    foreach (var pkg in Packages)
                    {
                        PackageParcelable parcelable = (PackageParcelable)pkg;
                        package = parcelable.Package;
                        routesheet.Add(package);
                    }

                }

        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var view = inflater.Inflate(Resource.Layout.CheckoutExcFragment, container, false);

            InitListView(view);
            return view;

        }

        public override void OnAttach(Context context)
        {
            base.OnAttach(context);

        }
        private void InitListView(View view)
        {
            ExcList = (ListView)view.FindViewById(Resource.Id.lstCheckoutExc);
            ExcList.ItemClick += ExcList_ItemClick;
            var adapter = new ListAdapter(this.Activity, routesheet);
            ExcList.Adapter = adapter;

        }

        private void ExcList_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {

            Package package = routesheet[e.Position];
            if (package !=null)
            {
                var json = Newtonsoft.Json.JsonConvert.SerializeObject(package);
                Intent intent = new Intent(this.Activity, Java.Lang.Class.FromType(typeof(PackageInfo)));
                intent.PutExtra("PackageDetails", json);
                StartActivity(intent);
            }
        }
    }

主要活动代码:

 private void MoveSelectedClick_Click(object sender, EventArgs e)
        {
            try
            {
             // Here I want to get the checkbox selected list items

            }
            catch (Exception ex)
            {

            }

        }
  1. 我添加了复选框选中事件,我想在其中获取所选列表项的详细信息并保存在持有人中。
  2. 在按钮单击事件中从持有者那里获取选中的列表项。我不确定这是否是正确的方法。

我的问题是我无法获取复选框选定列表项的详细信息。我验证了许多文章,但我找不到答案。请帮忙。谢谢。

【问题讨论】:

    标签: android listview xamarin checkbox


    【解决方案1】:

    我创建了一个演示来模拟您的代码,它可以正常工作。 主要代码是:

    CheckBoxAdapter.cs

    public class CheckBoxAdapter : BaseAdapter<ItemModel>
    {
        private Activity activity;
        private List<ItemModel> datalist;
    
        public CheckBoxAdapter(Activity activity, List<ItemModel> datalist)
        {
            this.activity = activity;
            this.datalist = datalist;
        }
    
        public override ItemModel this[int position] {
            get { return datalist[position]; }
        }
    
        public override int Count {
            get { return datalist.Count; }
        }
    
        public override long GetItemId(int position)
        {
            return position;
        }
    
        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            View view = convertView;
            MyViewHolder holder;
    
            if (view != null)
            {
                holder = view.Tag as MyViewHolder;
                holder.mCheckBox.Tag = position;
            }
            else 
            {
                holder = new MyViewHolder();
                view = this.activity.LayoutInflater.Inflate(Resource.Layout.item_layout, null);
    
                holder.mCheckBox = view.FindViewById<CheckBox>(Resource.Id.chkCaptain);
                holder.DeliveryCompany = view.FindViewById<TextView>(Resource.Id.txtName);
                holder.StopId = view.FindViewById<TextView>(Resource.Id.txtTeam);
    
                holder.mCheckBox.Tag = position;
    
                view.Tag = holder;
            }
    
            ItemModel player = this.datalist[position];
    
            holder.mCheckBox.SetOnCheckedChangeListener(null);
            holder.mCheckBox.Checked = player.IsChecked;
            holder.mCheckBox.SetOnCheckedChangeListener(new CheckedChangeListener(this.activity,datalist));
    
            return view;
        }
    
    
        public class MyViewHolder : Java.Lang.Object
        {
            public TextView DeliveryCompany { get; set; }
            public CheckBox mCheckBox { get; set; }
    
            public TextView StopId { get; set; }
        }
    
        private class CheckedChangeListener : Java.Lang.Object, CompoundButton.IOnCheckedChangeListener
        {
            private Activity activity;
            private List<ItemModel> list;
    
            public CheckedChangeListener(Activity activity, List<ItemModel> datalist)
            {
                this.activity = activity;
                this.list = datalist;
            }
    
            public void OnCheckedChanged(CompoundButton buttonView, bool isChecked)
            {
                if (isChecked)
                {
                    int position = (int)buttonView.Tag;
    
                    ItemModel item = list[position];
                    item.IsChecked = true;
                    list[position].IsChecked = true;
    
                    string text = string.Format("{0} Checked.", item.Name);
                    Toast.MakeText(this.activity, text, ToastLength.Short).Show();
                }
                else {
                    int position = (int)buttonView.Tag;
    
                    list[position].IsChecked= false;
                }
            }
        }
    }
    

    当我们点击按钮时,我们会通过过滤datalist得到所有checkbox选中的列表项:

    private void MBtn_Click(object sender, System.EventArgs e)
        {
            foreach (ItemModel model in dataList) {
                if (model.IsChecked) {
                    System.Diagnostics.Debug.WriteLine("selected item = " + model.Name );
                }
            }
        }
    

    注意:

    1.我们可以通过将Tag设置为CheckBox来设置和获取item的位置。

      if (view != null)
            {
                holder = view.Tag as MyViewHolder;
                holder.mCheckBox.Tag = position;
            }
            else 
            {
                holder = new MyViewHolder();
                view = this.activity.LayoutInflater.Inflate(Resource.Layout.item_layout, null);
    
                holder.mCheckBox = view.FindViewById<CheckBox>(Resource.Id.chkCaptain);
                holder.DeliveryCompany = view.FindViewById<TextView>(Resource.Id.txtName);
                holder.StopId = view.FindViewById<TextView>(Resource.Id.txtTeam);
    
                holder.mCheckBox.Tag = position;
                view.Tag = holder;
            }
    

    2.你ListAdapterViewHolder的变量CheckBox不对,是一个类名。

     class ListAdapterViewHolder : Java.Lang.Object
      {
        public TextView DeliveryCompany { get; set; }
        public TextView StopId { get; set; }
        public CheckBox CheckBox { get; set; } // here 
       }
    

    【讨论】:

    • 谢谢@Jessie Zhang。它正在工作。你拯救了我的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多