提问人:Kiril 提问时间:10/30/2023 更新时间:10/30/2023 访问量:64
Xamarin Android 处理位置更改
Xamarin Android handling position change
问:
我正在将 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);
};
}
}
答:
0赞
Jessie Zhang -MSFT
10/30/2023
#1
if (shoppingListItems[position].IsChecked)
{
selectedShoppingViewHolder.radioButton.Checked = true;
}
从你上面发布的代码中,我发现你的代码存在一些逻辑问题。例如,我们应该将值分配给 的值是 还是 。radioButton.Checked
shoppingListItems[position].IsChecked
true
false
这应该是:
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,我可以知道您的问题是否已解决吗?如果没有,请在此处分享。我们可以共同努力解决这个问题。
评论