ViewPager片段中的RecyclerView导致InflateException

时间:2018-04-18 10:03:25

标签: xamarin.android

我有一个带片段的TabLayout。在其中一个片段中,我想添加一个RecyclerView。我已经为它实现了代码并进行了部署,但是当我启动应用程序时,我在 tabLayout.SetupWithViewPager(viewPager)中收到以下错误:

Android.Views.InflateException:二进制XML文件行#15:android.support.v7.widget.AppCompatTextView无法强制转换为android.widget.Button

有时只是

Android.Views.InflateException:超时超时获取异常详情

我尝试在新项目中为RecyclerView复制相同的代码,但只有在MainActivity中才有效。所以我做错了什么......

我的代码:

Main.axml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.design.widget.TabLayout
        android:id="@+id/tablayout_navigation"
        android:layout_width="match_parent"
        app:tabTextColor="#ffffff"
        app:tabSelectedTextColor="#08aeab"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:background="?attr/colorPrimary"
        android:elevation="4dp" />
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_margin="0dp" />
</LinearLayout>

Overview.axml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal|center_vertical"
    android:minWidth="25px"
    android:minHeight="25px">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>

AppointmentListItem.axml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
  <TextView
      android:text="Name"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/txtName"
      android:textColor="#fff"/>
</LinearLayout>

RecyclerAdapter.cs:

class RecyclerAdapter : RecyclerView.Adapter
{

    private List<Appointment> mAppointments;

    public RecyclerAdapter(List<Appointment> appointments)
    {
        mAppointments = appointments;
    }

    public class MyView : RecyclerView.ViewHolder
    {
        public View mMainView { get; set; }
        public TextView mName { get; set; }

        public MyView(View view) : base(view)
        {
            mMainView = view;
        }
    }

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.AppointmentListItem, parent, false);

        TextView txtName = row.FindViewById<TextView>(Resource.Id.txtName);

        MyView view = new MyView(row) { mName = txtName };
        return view;
    }

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        MyView myHolder = holder as MyView;
        myHolder.mName.Text = mAppointments[position].Name;
    }

    public override int ItemCount
    {
        get { return mAppointments.Count;  }
    }

}

OverviewFragment.cs

class OverviewFragment : Android.Support.V4.App.Fragment
{

    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private RecyclerView.Adapter mAdapter;
    private List<Appointment> mAppointments;

    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Use this to return your custom view for this Fragment 
        View view = inflater.Inflate(Resource.Layout.Overview, container, false);

        mAppointments = new List<Appointment>();
        mAppointments.Add(new Appointment("Test1"));
        mAppointments.Add(new Appointment("Test2"));
        mAppointments.Add(new Appointment("Test3"));
        mAppointments.Add(new Appointment("Test4"));
        mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.recyclerView);
        mLayoutManager = new LinearLayoutManager(view.Context);
        mRecyclerView.SetLayoutManager(mLayoutManager);
        mAdapter = new RecyclerAdapter(mAppointments);
        mRecyclerView.SetAdapter(mAdapter);

        return view;
    }

}

MainActivity.cs:

public class MainActivity : AppCompatActivity
{

    private TabLayout tabLayout;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);

        tabLayout = FindViewById<TabLayout>(Resource.Id.tablayout_navigation);

        ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.pager);
        SetupViewPager(viewPager);
        tabLayout.SetupWithViewPager(viewPager);
    }

    private void SetupViewPager(ViewPager viewPager)
    {
        viewPager.OffscreenPageLimit = 3;

        PageAdapter adapter = new PageAdapter(SupportFragmentManager);
        adapter.AddFragment(new OverviewFragment(), Resources.GetString(Resource.String.overview));
        adapter.AddFragment(new CalendarFragment(), Resources.GetString(Resource.String.calendar));
        adapter.AddFragment(new SharesFragment(), Resources.GetString(Resource.String.share));

        viewPager.Adapter = adapter;
    }

}

0 个答案:

没有答案