如何修复“无法将类型BaseExpandableListAdapter隐式转换为Android.Widget.IListAdapter”

时间:2019-06-22 14:42:33

标签: c# xamarin.android

我正在尝试设置一个自定义可扩展列表视图适配器(继承自BaseExpandableListAdapter),以用作Xamarin.Android中ExpandableListView小部件的适配器。

我正在使用Visual Studio 2019和Xamarin.Android v28.0.0.1

从这些网站的示例中,我得到了一些我认为应该起作用的信息。

http://www.appliedcodelog.com/2016/06/expandablelistview-in-xamarin-android.html https://gist.github.com/lprichar/904ade6f1aaf96d172436bed3fb24d9b https://www.codeproject.com/Articles/677206/MonoAndroid-Writing-ExpandableListView-amd

answers_fragment.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ExpandableListView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/answers" />
</LinearLayout>

Fragments.cs

    public class AnswersFragment : Fragment
    {
        private readonly Dictionary<string, bool> answers;

        public AnswersFragment(Dictionary<string, bool> answers)
        {
            this.answers = answers;
        }

        // Display list of the questions and where answers matched.
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.answers_fragment, container, false);
            view.FindViewById<ExpandableListView>(Resource.Id.answers).Adapter = new AnswersListViewAdapter(Context, answers); // This is where the implicit type conversion error occurs
            return view;
        }
    }

Adapter.cs

    class AnswersListViewAdapter : BaseExpandableListAdapter
    {
        private readonly Context context;
        private readonly Dictionary<string, bool> answers;

        public AnswersListViewAdapter(Context context, Dictionary<string, bool> answers)
        {
            this.context = context;
            this.answers = answers;
        }

        public override Java.Lang.Object GetChild(int groupPosition, int childPosition)
        {
            return answers.Values.ElementAt(childPosition);            
        }

        public override long GetChildId(int groupPosition, int childPosition)
        {
            return childPosition;
        }

        public override int GetChildrenCount(int groupPosition)
        {
            return answers.Count;
        }

        public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
        {
            // Setup view logic
        }

        public override Java.Lang.Object GetGroup(int groupPosition)
        {
            return answers.Keys.ElementAt(groupPosition);
        }

        public override int GroupCount
        {
            get
            {
                return answers.Count;
            }
        }

        public override long GetGroupId(int groupPosition)
        {
            return groupPosition;
        }

        public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
        {
            // Setup view logic
        }

        public override bool HasStableIds
        {
            get
            {
                return false;
            }
        }
        public override bool IsChildSelectable(int groupPosition, int childPosition)
        {
            return true;
        }
    }

但是,当我尝试实现自定义适配器时,出现以下错误:

Cannot implicitly convert type 'AnswersListViewAdapter' to 'Android.Widget.IListViewAdapter. An explicit conversion exists (are you missing a cast?)'

我认为这就像在适配器声明前面添加(IListAdapter)强制转换一样简单,但这会在运行时引发以下错误。

Unhandled Exception:

System.InvalidCastException: <Timeout exceeded getting exception details>

谁能看到我要去哪里错了?

1 个答案:

答案 0 :(得分:0)

为便于理解,我们可以定义如下变量:

  AnswersListViewAdapter listAdapter;
  ExpandableListView expListView;

并像这样使用:

 public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {

        View view = inflater.Inflate(Resource.Layout.answers_fragment, container, false);
        expListView = view.FindViewById<ExpandableListView>(Resource.Id.answers);
        listAdapter = new AnswersListViewAdapter(Application.Context, answers); // This is where the implicit type conversion error occurs
        expListView.SetAdapter(listAdapter);

        //view.FindViewById<ExpandableListView>(Resource.Id.answers).Adapter = new AnswersListViewAdapter(Context, answers);

        return view;
    }

当然,您也可以像这样直接使用:

 view.FindViewById<ExpandableListView>(Resource.Id.answers).SetAdapter(new AnswersListViewAdapter(Application.Context, answers));