通过微调器(C#)过滤时,在列表视图上维护选中的iTen
我遇到了一个无法修复的问题,我创建了一个自定义对话框,其中显示了一个由自定义BaseAdapter填充了我的对象的Listview,我在单击EditText时打开此对话框,以便检查我想要的iTen,所有这些iTen将传递回EditText,请参见下图: 单击“确定”按钮时,我的编辑文本将填充(项目A、项目B) 如果我再次点击编辑文本,项目A和项目B应该已经被选中了。。。 我成功地做到了这一点,但现在,我需要用当前类别过滤Listview,为此,我在微调器上添加了一个ItemSelect侦听器,它将查询数据库以获得过滤后的iTen,清除了我的当前列表,添加了新列表并在适配器上调用NotifyDataSetChanged(),这一切都很好 问题是,即使我更改了类别,我也需要跟踪所选的ITEN,例如,我在“类别一”中检查了2个ITEN,更改为“类别二”并检查了2个以上的ITEN,最后,我需要获得所有这4个ITEN,例如,项目A出现在多个类别中,当我在类别之间切换时,如何保持检查状态 现在,这是我的代码:通过微调器(C#)过滤时,在列表视图上维护选中的iTen,c#,android,listview,xamarin,C#,Android,Listview,Xamarin,我遇到了一个无法修复的问题,我创建了一个自定义对话框,其中显示了一个由自定义BaseAdapter填充了我的对象的Listview,我在单击EditText时打开此对话框,以便检查我想要的iTen,所有这些iTen将传递回EditText,请参见下图: 单击“确定”按钮时,我的编辑文本将填充(项目A、项目B) 如果我再次点击编辑文本,项目A和项目B应该已经被选中了。。。 我成功地做到了这一点,但现在,我需要用当前类别过滤Listview,为此,我在微调器上添加了一个ItemSelect侦听器,
class MultipleAnimalSelectionAdapter : BaseAdapter<AnimalBean>
{
private List<AnimalBean> animaisList;
private Context cx;
private Dictionary<int, bool> checkedAnimals = new Dictionary<int, bool>();
public MultipleAnimalSelectionAdapter(Context cx, List<AnimalBean> animaisList)
{
this.cx = cx;
this.animaisList = animaisList;
for (int i = 0; i < animaisList.Count; i++)
{
checkedAnimals.Add(i, false);
}
}
public override AnimalBean this[int position]
{
get
{
return animaisList[position];
}
}
public override int Count
{
get
{
return animaisList.Count;
}
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
ViewHolder viewHolder;
if (row == null)
{
row = LayoutInflater.From(cx).Inflate(Resource.Layout.dialog_animais_row, null, false);
viewHolder = new ViewHolder();
viewHolder.CbAnimal = row.FindViewById<CheckBox>(Resource.Id.cbAnimal);
row.Tag = viewHolder;
}
else
{
viewHolder = (ViewHolder)row.Tag;
}
AnimalBean animal = (AnimalBean) GetItem(position);
viewHolder.CbAnimal.Clickable = false;
viewHolder.CbAnimal.Focusable = false;
viewHolder.CbAnimal.Text = animal.AnimalNome;
viewHolder.CbAnimal.Tag = position;
if (checkedAnimals[(int)viewHolder.CbAnimal.Tag])
viewHolder.CbAnimal.Checked = true;
else
viewHolder.CbAnimal.Checked = false;
return row;
}
public void ToogleChecked(int position)
{
if (checkedAnimals[position])
checkedAnimals[position] = false;
else
checkedAnimals[position] = true;
NotifyDataSetChanged();
}
public void ToogleChecked(AnimalBean animal)
{
for(int i = 0; i < animaisList.Count; i++)
{
if (animaisList[i].AnimalId == animal.AnimalId)
ToogleChecked(i);
}
NotifyDataSetChanged();
}
public List<int> GetCheckedAnimaisPosition()
{
List<int> checkedPos = new List<int>();
for(int i = 0; i < checkedAnimals.Count; i++)
{
if(checkedAnimals[i])
{
checkedPos.Add(i);
}
}
return checkedPos;
}
public List<AnimalBean> GetCheckedAnimais()
{
List<AnimalBean> animais = new List<AnimalBean>();
for(int i = 0; i < checkedAnimals.Count; i++)
{
if (checkedAnimals[i])
animais.Add(animaisList[i]);
}
return animais;
}
// ViewHolder class
private class ViewHolder : Java.Lang.Object
{
public CheckBox CbAnimal;
}
}
这正是我想要的完美工作方式,但我需要能够过滤此ListView并始终保持选中的iTen,而不考虑数据列表中的更改
任何帮助都将不胜感激!
多谢各位 也许你可以建立一个临时列表,在那里你可以跟踪这对情侣,然后你可以迭代列表以建立一个元素数组来传递给你的适配器(或者你可以把这个列表传递给一个新的适配器),然后调用NotifyDataSetChanged()来重新绘制listView,将此选中状态作为bool类型列放在数据库中,这样就可以用列表值填充复选框状态。
ListView lvDialogAnimais = dialog.FindViewById<ListView>(Resource.Id.lvDialogAnimais);
MultipleAnimalSelectionAdapter animaisAdapter = new MultipleAnimalSelectionAdapter(this, animaisList);
lvDialogAnimais.Adapter = animaisAdapter;
foreach (AnimalBean selAnimal in selectedAnimais)
{
animaisAdapter.ToogleChecked(selAnimal);
}
lvDialogAnimais.ItemClick += (ss, ee) =>
{
animaisAdapter.ToogleChecked(ee.Position);
selectedAnimais.Clear();
selectedAnimais.AddRange(animaisAdapter.GetCheckedAnimais());
};
Button btnCDOk = dialog.FindViewById<Button>(Resource.Id.btnCDOk);
btnCDOk.Click += (ss, ee) =>
{
tmp.Text = string.Join(", ", selectedAnimais);
dialog.Dismiss();
};
spinDialogCategorias.ItemSelected += (ss, ee) =>
{
animaisList.Clear();
// Query the database
animaisAdapter.NotifyDataSetChanged(); }