【问题标题】:Xamarin Android: Why divide elements by group on recyclerview with three keys is not working?Xamarin Android:为什么用三个键在 recyclerview 上按组划分元素不起作用?
【发布时间】:2019-09-24 20:22:28
【问题描述】:

大家好,我叫谷口

我已经实现了一个 recyclerview 并将 recyclerview 项目划分为一组。当我尝试分成两组时没有显示代码错误,但回收站上的所有项目都显示仅显示查看器文本视图名称

如下图:

https://drive.google.com/open?id=1TX5R0o44v-nWcTduYsqmH7KCFSDraZ24

第一个列表类:

public class DateNow : ListItem
{
    public string dateNow{ set; get; }
    public override int getType()
    {
        return TYPE_HEADER_NOW;
    }

}

第一个视图:

public class RecyclerViewNowHolder : RecyclerView.ViewHolder
{

    public TextView mDateNow;

    public RecyclerViewNowHolder(View itemView) : base(itemView)
    {
        mDateNow = itemView.FindViewById<TextView>(Resource.Id.mDateNow);


    }

}

}

第二个列表类:

 public class DateYesterday : ListItem
{
    public string dateYesterday { set; get; }
    public override int getType()
    {
        return TYPE_HEADER_YESTERDAY;
    }
}

第二个视图:

 public class RecyclerViewYesterdayHolder : RecyclerView.ViewHolder
{
    public TextView mDateYesterday;

    public RecyclerViewYesterdayHolder(View itemView) : base(itemView)
    {
        mDateYesterday = itemView.FindViewById<TextView>(Resource.Id.mDateYesterday);

    }
}

列表项类:

public abstract class ListItem
{

    public static int TYPE_HEADER = 0;
    public static int TYPE_CONTENT = 1;
    public static int TYPE_HEADER_NOW = 2;
    public static int TYPE_HEADER_YESTERDAY = 3;

    abstract public int getType();
}

我的 recyclerview 适配器:

  public class RecyclerAdapter : RecyclerView.Adapter
{

    private Activity mActivity;
    private List<ListItem> mEmails;
    private Context context;

    public RecyclerAdapter(List<ListItem> emails, Context context)
    {
        mEmails = emails;
        this.context = context;
    }

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


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

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

    }

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

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


    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        if (viewType == ListItem.TYPE_HEADER_NOW)
        {
            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_YESTERDAY)
        {
            View headYesterday = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.recyclerviewYesterday, parent, false);

            RecyclerViewYesterdayHolder view = new RecyclerViewYesterdayHolder(headYesterday);
            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_NOW)
        {
            RecyclerViewNowHolder myHolder = holder as RecyclerViewNowHolder;
            myHolder.mDateNow.Text = "Hoje";

        }
        else if (type == ListItem.TYPE_HEADER_YESTERDAY)
        {
            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;
        }

    }

}   

我的主要活动类:

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
    public static RecyclerView mRecyclerView;
    public static RecyclerView.LayoutManager mLayoutManager;
    public RecyclerView.ViewHolder holder;
    public static BottomNavigationView bottomnavigationview1;
    public static RecyclerView.Adapter mAdapter;
    public static List<Email> mEmails;
    private List<ListItem> mItems;


    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();

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

    }

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

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

                }

            }

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

            int yesterday = Convert.ToInt32(today.Day.ToString()) - 1;

            foreach (var date in dateItems)
            {
                mItems.Add(date);
                foreach (var email in mEmails)
                {
                    if (date.dateNow.Equals(DateTime.Now.Day.ToString()))
                    {
                        mItems.Add(email);
                    }

                }
            }


    }

【问题讨论】:

    标签: c# xamarin.android


    【解决方案1】:

    从你的代码中,我们可以发现你只遍历列表dateItems并将dateItems的子元素添加到mItems,而mItems是你RecyclerView的数据源:

            foreach (var date in dateItems)
            {
                mItems.Add(date);
                foreach (var email in mEmails)
                {
                    if (date.dateNow.Equals(DateTime.Now.Day.ToString()))
                    {
                        mItems.Add(email);
                    }
                }
            }
    

    从下面的代码中,我们可以看到List&lt;DateNow&gt; dateItems = new List&lt;DateNow&gt;();,而dateItemsDateNow类型的数据集合。

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

    所以,recyclervier 只显示了RecyclerViewNowHolder 文本视图名称(DateNow),它的方法getType()TYPE_HEADER_NOW

    注意:

    如果添加以下代码,你会发现回收站也会显示RecyclerViewYesterdayHolder ViewHolder。

    foreach (var date in dateYesterday) {
                mItems.Add(date);
            }
    

    【讨论】:

    【解决方案2】:

    我可以通过以下方式解决这个问题:

    关于主要活动:

        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();
    
            //Create our layout Manager
            mLayoutManager = new LinearLayoutManager(this);
            mRecyclerView.SetLayoutManager(mLayoutManager);
            RecyclerAdapter mAdapter = new RecyclerAdapter(mItems, this);
            mRecyclerView.SetAdapter(mAdapter);
    
        }
    
        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!!" });
            mEmails.Add(new Email() { date = "9/24/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/23/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "8/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "8/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "7/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "7/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "6/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "6/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "5/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "5/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "4/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "4/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/19/2018", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/19/2018", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
    
            List<string> dateList = new List<string>();
            List<DateNow> dateNow = new List<DateNow>();
            List<DateYesterday> dateYesterday = new List<DateYesterday>();
    
            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 });
                }
    
            }
    
            DateTime today = DateTime.Today;
            string sub = today.ToString().Substring(0, 9);
    
            int yesterday = Convert.ToInt32(today.Day.ToString()) - 1;
            string ontem = today.Month.ToString() + "/" + yesterday.ToString() + "/" + today.Year.ToString() ;
    
            foreach (var date in dateNow)
            {
                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);
                                }
    
                            }
                        }
                    }
                }
                else
                {
                    foreach (var email in mEmails)
                    {
                        if (!email.date.Equals(sub) && !email.date.Equals(ontem))
                        {
                            mItems.Add(email);
                        }
    
                    }
                }
    
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2020-06-20
      • 2021-06-05
      相关资源
      最近更新 更多