gpt4 book ai didi

android-listview - MvxListView 可检查列表项

转载 作者:行者123 更新时间:2023-12-04 08:34:32 25 4
gpt4 key购买 nike

我想让 CustomChoiceList 与 MvvmCross 一起工作,但很难让示例正常工作,无法选择 ListItem。

事实上,该示例使用了一个自定义的 LinearLayout,它扩展了 LinearLayout 并实现了 ICheckable。当对 MvxAdapter 和 MvxListView 使用相同的布局时,永远不会调用 OnCreateDrawableState 方法,并且永远不会突出显示文本和选择图标。

我知道所选项目可以存储在 ViewModel 中。

这是原始样本: https://github.com/xamarin/monodroid-samples/tree/master/CustomChoiceList

最佳答案

事实上,MvxAdapter 类在幕后将列表项布局扩展到 MvxListItemView 中,因此您实际上在列表项模板周围获得了一个额外的 FrameLayout。 MvxListItemView 没有实现 ICheckable,因此不会传播是否检查项目的信息。

诀窍是实现自定义 MvxAdapter 覆盖 CreateBindableView 并返回实现 ICheckable 的 MvxListItemView 的子类。您还必须设置 android:duplicateParentState="true" 列表项模板 (list_item.axml) 的根

您可以在此处找到完整的项目: https://github.com/takoyakich/mvvmcross-samples/tree/master/CustomChoiceList

相关变化如下:

list_item.axml:

<?xml version="1.0" encoding="utf-8"?>
<customchoicelist.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:duplicateParentState="true"
...

扩展的 MvxAdapter:

class MyMvxAdapter : MvxAdapter {
private readonly Context _context;
private readonly IMvxAndroidBindingContext _bindingContext;

public MyMvxAdapter(Context c) :this(c, MvxAndroidBindingContextHelpers.Current())
{
}
public MyMvxAdapter(Context context, IMvxAndroidBindingContext bindingContext) :base(context, bindingContext)
{
_context = context;
_bindingContext = bindingContext;
}
protected override MvxListItemView CreateBindableView(object dataContext, int templateId)
{
return new MyMvxListItemView(_context, _bindingContext.LayoutInflater, dataContext, templateId);
}
}

扩展的 MvxListItemView:

class MyMvxListItemView : MvxListItemView, ICheckable
{

static readonly int[] CHECKED_STATE_SET = {Android.Resource.Attribute.StateChecked};
private bool mChecked = false;

public MyMvxListItemView(Context context,
IMvxLayoutInflater layoutInflater,
object dataContext,
int templateId)
: base(context, layoutInflater, dataContext, templateId)
{
}

public bool Checked {
get {
return mChecked;
} set {
if (value != mChecked) {
mChecked = value;
RefreshDrawableState ();
}
}
}

public void Toggle ()
{
Checked = !mChecked;
}

protected override int[] OnCreateDrawableState (int extraSpace)
{
int[] drawableState = base.OnCreateDrawableState (extraSpace + 1);

if (Checked)
MergeDrawableStates (drawableState, CHECKED_STATE_SET);

return drawableState;
}
}

关于android-listview - MvxListView 可检查列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com