Xamarin Android 处理位置更改

Xamarin Android handling position change

提问人:Kiril 提问时间:10/30/2023 更新时间:10/30/2023 访问量:64

问:

我正在将 Xamarin Android 与 C# 一起使用。我有一个适配器,可以给回收机视图支架充气。视图容器具有很少的文本字段和一个单选按钮。选中后,它应该移动到行的底部,并将更改保存到本地数据库。然后我在适配器中使用 NotifyDataSetChanged()。我遇到的问题是,一旦单击了单选按钮,似乎其他行也被单击了。此外,有时当我单击单选按钮时,它不会将状态更改为选中/未选中。

这是适配器

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
    if (holder is SelectedShoppingListViewHolder selectedShoppingViewHolder)
    {
        selectedShoppingViewHolder.shoppingListItemId.Text = shoppingListItems[position].Id.ToString();
        if (shoppingListItems[position].IsChecked)
        {
            selectedShoppingViewHolder.radioButton.Checked = true;
        }
        selectedShoppingViewHolder.shoppingListItemNameField.Text = shoppingListItems[position].ShoppingListItemName;
        selectedShoppingViewHolder.shoppingListItemQuantityField.Text = shoppingListItems[position].ShoppingListItemQuantity.ToString();
        selectedShoppingViewHolder.shoppingListMeasurementDropDown.SetSelection(shoppingListItems[position].ShoppingListItemMeasurement);

        selectedShoppingViewHolder.radioButton.Click += (sender, args) =>
        {
            if (shoppingListItems[position].IsChecked)
            {
                selectedShoppingViewHolder.radioButton.Checked = false;
                Database.UpdateShoppingListItemIsChecked(shoppingListItems[position].Id, false);
                shoppingListItems = Database.GetAllShoppingListItemsByShopListId(this.shoppingListId).OrderBy(sli => sli.IsChecked).ToList();
                NotifyDataSetChanged();
            }
            else
            {
                selectedShoppingViewHolder.radioButton.Checked = true;
                Database.UpdateShoppingListItemIsChecked(shoppingListItems[position].Id, true);
                shoppingListItems = Database.GetAllShoppingListItemsByShopListId(this.shoppingListId).OrderBy(sli => sli.IsChecked).ToList();
                NotifyDataSetChanged();
            }
        };

        selectedShoppingViewHolder.deleteRowButton.Click += (sender, args) =>
        {
            Database.DeleteShoppingListItemById(int.Parse(selectedShoppingViewHolder.shoppingListItemId.Text));
            shoppingListItems.RemoveAt(position);
            NotifyItemRemoved(position);
        };
    }
}
C# Xamarin Xamarin.Android

评论


答:

0赞 Jessie Zhang -MSFT 10/30/2023 #1
if (shoppingListItems[position].IsChecked)
{
    selectedShoppingViewHolder.radioButton.Checked = true;
}

从你上面发布的代码中,我发现你的代码存在一些逻辑问题。例如,我们应该将值分配给 的值是 还是 。radioButton.CheckedshoppingListItems[position].IsChecked truefalse

这应该是:

  selectedShoppingViewHolder.radioButton.Checked = shoppingListItems[position].IsChecked;

此外,您可以简单地为 RadioButton 创建单击事件,如下所示:

     YourItem item=   shoppingListItems[position];

     selectedShoppingViewHolder.radioButton.SetOnClickListener(new MyRadioButtonClickedListener(item));
     selectedShoppingViewHolder.radioButton.Checked = item.IsChecked;



   class MyRadioButtonClickedListener : Java.Lang.Object, View.IOnClickListener
    {
        YourItem item;

        public MyRadioButtonClickedListener(YourItem item)
        {
            this.item = item;
        }
        public void OnClick(View v)
        {
            item.IsChecked = !item.IsChecked;

            adapter.NotifyDataSetChanged();

        }
    }

您可以参考以下代码:

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            if (holder is SelectedShoppingListViewHolder selectedShoppingViewHolder)
            {

                YourItem item =  shoppingListItems[position];

                selectedShoppingViewHolder.shoppingListItemId.Text = item.Id.ToString();

                //if (shoppingListItems[position].IsChecked)
                //{
                //    selectedShoppingViewHolder.radioButton.Checked = true;
                //}
                selectedShoppingViewHolder.shoppingListItemNameField.Text = item.ShoppingListItemName;
                selectedShoppingViewHolder.shoppingListItemQuantityField.Text = item.ShoppingListItemQuantity.ToString();
                selectedShoppingViewHolder.shoppingListMeasurementDropDown.SetSelection(item.ShoppingListItemMeasurement);
    
                selectedShoppingViewHolder.radioButton.SetOnClickListener(new MyRadioButtonClickedListener(item));
                
               //assign item.IsChecked to selectedShoppingViewHolder.radioButton
                selectedShoppingViewHolder.radioButton.Checked = item.IsChecked;


                selectedShoppingViewHolder.deleteRowButton.Click += (sender, args) =>
                {
                    Database.DeleteShoppingListItemById(int.Parse(selectedShoppingViewHolder.shoppingListItemId.Text));
                    shoppingListItems.RemoveAt(position);
                    NotifyItemRemoved(position);
                };
            }
        }

注意:

1.您可以更改您的项目模型。YourItem

2.我不太明白为什么在更改状态后要重新加载数据,这可能会影响数据的显示。RadioButton

 shoppingListItems = Database.GetAllShoppingListItemsByShopListId(this.shoppingListId).OrderBy(sli => sli.IsChecked).ToList();

您可以按如下方式更新数据库:

   class MyRadioButtonClickedListener : Java.Lang.Object, View.IOnClickListener
    {
        YourItem item;

        public MyRadioButtonClickedListener(YourItem item)
        {
            this.item = item;
        }
        public void OnClick(View v)
        {
            item.IsChecked = !item.IsChecked;

            //update database here  
            Database.UpdateShoppingListItemIsChecked(item.Id, item.IsChecked);

            adapter.NotifyDataSetChanged();

        }
    }

评论

0赞 Jessie Zhang -MSFT 11/2/2023
嗨,@Kiril,我可以知道您的问题是否已解决吗?如果没有,请在此处分享。我们可以共同努力解决这个问题。