Xamarin Android:如何在recyclerview中获取摘要列表值

谷口桑托斯

我实现了一个recyclerview并按组将行分开。我正在使用抽象列表来分隔行。

我在工具栏上插入了一个复选框,以选择recyclerview中的所有行及其工作,但我也想做的是使用列表存储列值,并且此处显示错误,因为已插入要存储的值在提供给recyclerview行的列表中。

我的recyclerview适配器:

public class RecyclerAdapter : RecyclerView.Adapter
{
    private List<ListItem> mEmails;
    private Activity mActivity;
    public static int listPosition;
    private int position_collectID = 0;
    private List<collectSubject> mcollecSubject;

    private Boolean isSelected = false;

    public Boolean IsSelected()
    {
        return isSelected;
    }

    public void setSelected(Boolean selected)
    {

        isSelected = selected;
    }

    public RecyclerAdapter(List<ListItem> emails, Activity activity)
    {
        mEmails = emails;
        mActivity = activity;
    }

    public override int GetItemViewType(int position)
    {
        return mEmails[position].getType();
    }

    public override int ItemCount => mEmails.Count;

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        if (viewType == ListItem.TYPE_HEADER_DATENOW)
        {
            View headNow = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewNow, parent, false);

            RecyclerViewNowHolder view = new RecyclerViewNowHolder(headNow);
            return view;
        }

        else if (viewType == ListItem.TYPE_HEADER_DATEYESTERDAY)
        {
            View headYesterday = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewYesterday, parent, false);

            RecyclerViewYesterdayHolder view = new RecyclerViewYesterdayHolder(headYesterday);
            return view;
        }

        else if (viewType == ListItem.TYPE_HEADER_BEFORE)
        {
            View headBefore = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewBefore, parent, false);

            RecyclerViewBeforeHolder view = new RecyclerViewBeforeHolder(headBefore);
            return view;
        }

        else
        {
            View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.row, parent, false);
            RecyclerViewHolder view = new RecyclerViewHolder(row);
            return view;
        }


    }
    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        int type = GetItemViewType(position);
        if (type == ListItem.TYPE_HEADER_DATENOW)
        {
            RecyclerViewNowHolder myHolder = holder as RecyclerViewNowHolder;
            myHolder.mDateNow.Text = "Hoje";

        }

        else if (type == ListItem.TYPE_HEADER_BEFORE)
        {
            RecyclerViewBeforeHolder myHolder = holder as RecyclerViewBeforeHolder;
            myHolder.mDateBefore.Text = "Antes";

        }

        else if (type == ListItem.TYPE_HEADER_DATEYESTERDAY)
        {
            RecyclerViewYesterdayHolder myHolder = holder as RecyclerViewYesterdayHolder;
            myHolder.mDateYesterday.Text = "Ontem";

        }

        else
        {
            RecyclerViewHolder myHolder = holder as RecyclerViewHolder;

            myHolder.mDate.Text = ((Email)mEmails[position]).date;
            myHolder.mSubject.Text = ((Email)mEmails[position]).Subject;
            myHolder.mMessage.Text = ((Email)mEmails[position]).Message;

            myHolder.ItemView.SetBackgroundColor(((ListItem)mEmails[position]).IsSelected() ? Color.LightBlue : Color.Transparent);
            myHolder.ItemView.Tag = position;

        }
    }

    public void checkall()
    {

        int itemcheck = 0;
        if (mEmails != null)
        {
            mcollecSubject = new List<collectSubject>();

            foreach (ListItem email in mEmails)
            {

                email.setSelected(true);

                if (mcollecSubject == null) ;

                mcollecSubject.Add(new collectSubject() { Subject = ((Email)mEmails[itemcheck]).Subject });

                itemcheck++;

            }
        }

    }

}

我在哪里调用recyclerview:

public class MainActivity : AppCompatActivity
{
    public static RecyclerView mRecyclerView;
    public static RecyclerView.LayoutManager mLayoutManager;
    public RecyclerView.ViewHolder holder;
    public RecyclerAdapter mAdapter;
    private List<ListItem> mItems;
    public static List<Email> mEmails;
    public static Android.Support.V7.Widget.Toolbar toolbar;
    public static Android.Widget.CheckBox checkbox;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        Xamarin.Essentials.Platform.Init(this, bundle);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

        mRecyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerViwer);
        mRecyclerView.AddItemDecoration(new DividerItemDecoration(mRecyclerView.Context, DividerItemDecoration.Vertical));
        mRecyclerView.HasFixedSize = true;
        SetupList();

        List<string> dateList = new List<string>();
        List<DateNow> dateNow = new List<DateNow>();
        List<DateYesterday> dateYesterday = new List<DateYesterday>();
        List<DateBefore> dateBefore = new List<DateBefore>();

        mItems = new List<ListItem>();
        foreach (var email in mEmails)
        {
            if (!dateList.Contains(email.date))
            {
                dateList.Add(email.date);
                dateNow.Add(new DateNow() { dateNow = email.date });
                dateYesterday.Add(new DateYesterday() { dateYesterday = email.date });
                dateBefore.Add(new DateBefore() { dateBefore = email.date });
            }

        }

        DateTime today = DateTime.Today;
        string sub = today.ToString().Substring(0, 10);

        int yesterday = Convert.ToInt32(today.Day.ToString()) - 1;
        string ontem = today.Month.ToString() + "/" + yesterday.ToString() + "/" + today.Year.ToString();
        string ontem2 = today.Month.ToString() + "/" + yesterday.ToString() + "/" + "201";

        foreach (var date in dateNow)
        {
            string currentmes = today.Month.ToString();
            if (date.dateNow.Equals(sub))
            {
                mItems.Add(date);
                foreach (var email in mEmails)
                {
                    if (email.date.Equals(sub))
                    {
                        mItems.Add(email);

                    }

                }
            }

            else if (date.dateNow.Equals(ontem))
            {
                foreach (var DateYesterday in dateYesterday)
                {
                    if (DateYesterday.dateYesterday.Equals(ontem))
                    {
                        mItems.Add(DateYesterday);
                        foreach (var email in mEmails)
                        {
                            if (email.date.Equals(ontem))
                            {
                                mItems.Add(email);
                            }

                        }
                    }
                }
            }

        }

        int count = 0;
        foreach (var DateBefore in dateBefore)
        {
            if (count == 0)
            {
                mItems.Add(DateBefore);
                foreach (var email in mEmails)
                {
                    if (!email.date.Equals(ontem) && !email.date.Equals(sub))
                    {
                        mItems.Add(email);
                    }

                }

            }

            count = 1;
        }

        //Create our layout Manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.SetLayoutManager(mLayoutManager);
        mAdapter = new RecyclerAdapter(mItems, this);
        mRecyclerView.SetAdapter(mAdapter);

        var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
        SetSupportActionBar(toolbar);

        CheckBox checkbox = FindViewById<CheckBox>(Resource.Id.checkBox);
        checkbox.Click += (o, e) => {
            if (checkbox.Checked)
            {
                mAdapter.checkall();
            }
        };
    }

    private void SetupList()
    {
        mEmails = new List<Email>();
        mEmails.Add(new Email() { date = "9/25/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
        mEmails.Add(new Email() { date = "9/25/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
        mEmails.Add(new Email() { date = "9/25/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
        mEmails.Add(new Email() { date = "9/24/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
        mEmails.Add(new Email() { date = "9/24/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
    }

错误在recyclerview中在线:

     mcollecSubject.Add(new collectSubject() { Subject = ((Email)mEmails[itemcheck]).Subject });

错误是:System.InvalidCastException:'指定的转换无效。'

张洁-MSFT

从您的代码中,我们可以看到的几个子类ListItem

   if (viewType == ListItem.TYPE_HEADER_DATENOW)
    {// Corresponding subclass: DateNow.cs
        View headNow = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewNow, parent, false);

        RecyclerViewNowHolder view = new RecyclerViewNowHolder(headNow);
        return view;
    }

    else if (viewType == ListItem.TYPE_HEADER_DATEYESTERDAY)
    {// Corresponding subclass: DateYesterday.cs
        View headYesterday = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewYesterday, parent, false);

        RecyclerViewYesterdayHolder view = new RecyclerViewYesterdayHolder(headYesterday);
        return view;
    }

    else if (viewType == ListItem.TYPE_HEADER_BEFORE)
    {// Corresponding subclass: DateBefore.cs
        View headBefore = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewBefore, parent, false);

        RecyclerViewBeforeHolder view = new RecyclerViewBeforeHolder(headBefore);
        return view;
    }
    else
    {//The left is subclass Email.cs
        View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.row, parent, false);
        RecyclerViewHolder view = new RecyclerViewHolder(row);
        return view;
    }

由于类Email是子类的ListItem,所以你可以施放ListItemEmail,但你需要确定哪些继承当前类对应于(DateNow.csDateYesterday.csDateBefore.csEmail.cs

例如:

            ListItem item = mEmails[itemcheck];
            if (item is Email)
            {
                Email email = (Email)mEmails[itemcheck];
                string subject = email.Subject;
            }
            else if (item is DateNow)
            {
                DateNow date = (DateNow)mEmails[itemcheck];

            }
            else if (item is DateBefore)
            {
                DateBefore date = (DateBefore)mEmails[itemcheck];

            }
            else 
            {// the left is DateYesterday
                DateYesterday date = (DateYesterday)mEmails[itemcheck];

            }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Android Xamarin.Forms中获取附近的WiFi网络列表?

来自分类Dev

如何在Xamarin android Array适配器中获取可见列表项计数

来自分类Dev

如何在Xamarin表单中获取复选框值

来自分类Dev

如何在Xamarin中获取GoogleApiClient?

来自分类Dev

如何在Xamarin中获取GoogleApiClient实例?

来自分类Dev

如何在Xamarin中获取ActivityManager的实例?

来自分类Dev

如何在Xamarin中获取GoogleApiClient实例?

来自分类Dev

如何在Xamarin Android中翻转图像?

来自分类Dev

如何在 Xamarin.android 中单击的项目上从 recyclerview 传递数据

来自分类Dev

如何在Xamarin中拍照?

来自分类Dev

如何在Xamarin中从SQLite获取具有匹配ID的值

来自分类Dev

RecyclerView中的OxyPlot -MVVMCross Xamarin.Android

来自分类Dev

如何在Xamarin android API级别超过28中获取包签名

来自分类Dev

如何在Xamarin.Forms中获取/检测屏幕尺寸?

来自分类Dev

如何在Xamarin中获取资产文件路径?

来自分类Dev

如何在Xamarin中获取当前GPS坐标

来自分类Dev

如何在IDE中获取Xamarin Studio C#输出?

来自分类Dev

如何在Xamarin表单的ItemTemplate中获取当前项目

来自分类Dev

如何在Xamarin.Forms中获取/检测屏幕尺寸?

来自分类Dev

如何在 Xamarin.Forms 中获取以前的数据

来自分类Dev

如何在 Xamarin Forms 中获取设备的 GPS 位置?

来自分类Dev

Xamarin Android中的BindableViewPager

来自分类Dev

如何在Xamarin Forms中调整值并使它不超过360?

来自分类Dev

如何在Android项目属性中启用调试(Xamarin Android)

来自分类Dev

如何在 Xamarin Android 中的 TextView 中显示源代码?

来自分类Dev

如何使用Xamarin在Android中同步获取GPS位置更新?

来自分类Dev

如何使用 Xamarin 表单在 Android 中获取 firstInstallTime?

来自分类Dev

如何在VS 2015中将Android xamarin项目部署到Xamarin Android Player

来自分类Dev

如何从SearchView xamarin android获取输入文本?

Related 相关文章

  1. 1

    如何在Android Xamarin.Forms中获取附近的WiFi网络列表?

  2. 2

    如何在Xamarin android Array适配器中获取可见列表项计数

  3. 3

    如何在Xamarin表单中获取复选框值

  4. 4

    如何在Xamarin中获取GoogleApiClient?

  5. 5

    如何在Xamarin中获取GoogleApiClient实例?

  6. 6

    如何在Xamarin中获取ActivityManager的实例?

  7. 7

    如何在Xamarin中获取GoogleApiClient实例?

  8. 8

    如何在Xamarin Android中翻转图像?

  9. 9

    如何在 Xamarin.android 中单击的项目上从 recyclerview 传递数据

  10. 10

    如何在Xamarin中拍照?

  11. 11

    如何在Xamarin中从SQLite获取具有匹配ID的值

  12. 12

    RecyclerView中的OxyPlot -MVVMCross Xamarin.Android

  13. 13

    如何在Xamarin android API级别超过28中获取包签名

  14. 14

    如何在Xamarin.Forms中获取/检测屏幕尺寸?

  15. 15

    如何在Xamarin中获取资产文件路径?

  16. 16

    如何在Xamarin中获取当前GPS坐标

  17. 17

    如何在IDE中获取Xamarin Studio C#输出?

  18. 18

    如何在Xamarin表单的ItemTemplate中获取当前项目

  19. 19

    如何在Xamarin.Forms中获取/检测屏幕尺寸?

  20. 20

    如何在 Xamarin.Forms 中获取以前的数据

  21. 21

    如何在 Xamarin Forms 中获取设备的 GPS 位置?

  22. 22

    Xamarin Android中的BindableViewPager

  23. 23

    如何在Xamarin Forms中调整值并使它不超过360?

  24. 24

    如何在Android项目属性中启用调试(Xamarin Android)

  25. 25

    如何在 Xamarin Android 中的 TextView 中显示源代码?

  26. 26

    如何使用Xamarin在Android中同步获取GPS位置更新?

  27. 27

    如何使用 Xamarin 表单在 Android 中获取 firstInstallTime?

  28. 28

    如何在VS 2015中将Android xamarin项目部署到Xamarin Android Player

  29. 29

    如何从SearchView xamarin android获取输入文本?

热门标签

归档