Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过微调器(C#)过滤时,在列表视图上维护选中的iTen_C#_Android_Listview_Xamarin - Fatal编程技术网

通过微调器(C#)过滤时,在列表视图上维护选中的iTen

通过微调器(C#)过滤时,在列表视图上维护选中的iTen,c#,android,listview,xamarin,C#,Android,Listview,Xamarin,我遇到了一个无法修复的问题,我创建了一个自定义对话框,其中显示了一个由自定义BaseAdapter填充了我的对象的Listview,我在单击EditText时打开此对话框,以便检查我想要的iTen,所有这些iTen将传递回EditText,请参见下图: 单击“确定”按钮时,我的编辑文本将填充(项目A、项目B) 如果我再次点击编辑文本,项目A和项目B应该已经被选中了。。。 我成功地做到了这一点,但现在,我需要用当前类别过滤Listview,为此,我在微调器上添加了一个ItemSelect侦听器,

我遇到了一个无法修复的问题,我创建了一个自定义对话框,其中显示了一个由自定义BaseAdapter填充了我的对象的Listview,我在单击EditText时打开此对话框,以便检查我想要的iTen,所有这些iTen将传递回EditText,请参见下图:

单击“确定”按钮时,我的编辑文本将填充(项目A、项目B) 如果我再次点击编辑文本,项目A和项目B应该已经被选中了。。。 我成功地做到了这一点,但现在,我需要用当前类别过滤Listview,为此,我在微调器上添加了一个ItemSelect侦听器,它将查询数据库以获得过滤后的iTen,清除了我的当前列表,添加了新列表并在适配器上调用NotifyDataSetChanged(),这一切都很好

问题是,即使我更改了类别,我也需要跟踪所选的ITEN,例如,我在“类别一”中检查了2个ITEN,更改为“类别二”并检查了2个以上的ITEN,最后,我需要获得所有这4个ITEN,例如,项目A出现在多个类别中,当我在类别之间切换时,如何保持检查状态

现在,这是我的代码:

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