我正在尝试设置一个自定义可扩展列表视图适配器(继承自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>
谁能看到我要去哪里错了?
答案 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));