android - 复选框选中的列表项 - Xamarin 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)
{
}
}
- 我添加了复选框选中事件,我想在其中获取所选列表项的详细信息并保存在持有人中。
- 在按钮单击事件上,从持有者那里获取选中的列表项。我不确定这是否是正确的方法。
我的问题是我无法获取复选框选定列表项的详细信息。我验证了许多文章,但我找不到答案。请帮忙。谢谢你。
解决方案
我创建了一个演示来模拟您的代码,它可以正常工作。主要代码是:
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;
}
}
}
}
当我们点击按钮时,我们将通过过滤数据列表获得所有复选框选中的列表项:
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 );
}
}
}
笔记:
Tag
1.我们可以通过将 设置为来设置和获取项目的位置CheckBox
。
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;
}
CheckBox
2.你的变量ListAdapterViewHolder
不对,是Class Name。
class ListAdapterViewHolder : Java.Lang.Object
{
public TextView DeliveryCompany { get; set; }
public TextView StopId { get; set; }
public CheckBox CheckBox { get; set; } // here
}
推荐阅读
- ios-app-extension - 依赖于 Swift 包的 Swift 嵌入式框架
- python-3.x - Python:更改变量与更改函数内的变量列表
- jekyll - 您可以在分配 Liquid 标签中使用两个 where 条件吗?
- android - React Native 版本不匹配 - 仅在 Android Studio 中编译时 - 适用于 METRO
- python - 根据字符串日期对json进行排序,在python中可以为空
- c# - 为什么即使在 csproj 中启用 C#8 后,我也不能在 UWP 中使用 System.Index?
- c# - 动态评估属性的通用函数
- python - 有没有办法干净地杀死uvicorn?
- command-line-interface - 无法创建具有特定概要的 CLI - 带有 Picocli 的 CLI
- linux - 如何使用 htaccess 限制仅访问同一父文件夹中的几个文件夹?