0

Hello everyone my name is Taniguchi.

I've implemented a recyclerview and i wish to divide items on this recyclerview on groups

There is a way that i can divide itens by key, but i need to create multiple axmls and viewholder, but i couldnt get how can i do that.

How can i divide elements in the recyclerview items using a key to divide then ?

I ve found this documentation but is on java.

Divide elements on groups in RecyclerView

someone has a example in C# ?

my recyclerview adapter:

public class RecyclerAdapter : RecyclerView.Adapter
{

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


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

    public RecyclerAdapter(List<Email> 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 RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        LayoutInflater inflater = LayoutInflater.From(parent.Context);
        View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.row, parent, false);
        RecyclerViewHolder vh = new RecyclerViewHolder(row);
        return vh;
    }
    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        RecyclerViewHolder myHolder = holder as RecyclerViewHolder;

        myHolder.mDate.Text = mEmails[position].date;
        myHolder.mSubject.Text = mEmails[position].Subject;
        myHolder.mMessage.Text = mEmails[position].Message;
    }

}

where i calling the recycleriew:

[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;


    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(mEmails, this);
        mRecyclerView.SetAdapter(mAdapter);

    }

    private void SetupList()
    {
        for (int i = 1; i <= 2; i++)
        {
            mEmails = new List<Email>();
            mEmails.Add(new Email() { date = "9/19/2019", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });
            mEmails.Add(new Email() { date = "9/18/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/18/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/18/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/18/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/18/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/18/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/18/2018", Subject = "Wanna Hang Out?", Message = "I ' ll   be around  tomorrow!!" });

        }
    }

my recyclerview holder:

 public class RecyclerViewHolder : RecyclerView.ViewHolder
{
    public TextView mDate;
    public TextView mSubject;
    public TextView mMessage;
    public CheckBox cbx;
    public Button bottonbutton;
    public int count = 0;
    private Action<object, View.LongClickEventArgs, int> onLongClick;

    public RecyclerViewHolder(View itemView) : base(itemView)
    {
        mDate = itemView.FindViewById<TextView>(Resource.Id.textView1);
        mSubject = itemView.FindViewById<TextView>(Resource.Id.textView2);
        mMessage = itemView.FindViewById<TextView>(Resource.Id.textView3);
        cbx = itemView.FindViewById<CheckBox>(Resource.Id.checkBox1);
    }
}
Taniguchi.sales
  • 107
  • 1
  • 7

1 Answers1

1

here is a sample according to your code :

1.process the data,here just a combination of data from the same date, not sorted by time,of course you could sort it.

private 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/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<DataItem> dateItems = new List<DataItem>();
        mItems = new List<ListItem>();
        foreach (var email in mEmails)
        {
            if (!dateList.Contains(email.date))
            {
                dateList.Add(email.date);
                dateItems.Add(new DataItem() { Date = email.date});

            }

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

            foreach (var email in mEmails)
            {
                if (date.Date.Equals(email.date))
                {
                    mItems.Add(email);
                }

            }
        }  
    }

2.create a ListItem class:

public abstract class ListItem
{

    public static  int TYPE_HEADER = 0;
    public static  int TYPE_CONTENT = 1;

    abstract public int getType();
}

3.create DateItem class which put the date:

class DataItem : ListItem
{
    public string Date { set; get; }
    public override int getType()
    {
        return TYPE_HEADER;
    }
}

4.let your Email extends the ListItem :

class Email:ListItem
{
    public string date { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
    public override int getType()
    {
        return TYPE_CONTENT;
    }
}

5.in the RecyclerAdapter:

class RecyclerAdapter : RecyclerView.Adapter
{


    private List<ListItem>  mEmails;


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

    }

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

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

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        int type = GetItemViewType(position);
        if (type == ListItem.TYPE_HEADER)
        {
            RecyclerViewHeadHolder myHolder = holder as RecyclerViewHeadHolder;
            myHolder.mDate.Text = ((DataItem)mEmails[position]).Date;

        }
        else
        {
            RecyclerViewHolder myHolder = holder as RecyclerViewHolder;
            myHolder.mName.Text = ((Email)mEmails[position]).date;
            myHolder.mSubject.Text = ((Email)mEmails[position]).Subject;
            myHolder.mMessage.Text = ((Email)mEmails[position]).Message;
        }      
    }
    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        if (viewType == ListItem.TYPE_HEADER)
        {
            View head = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.head, parent, false);

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

            RecyclerViewHolder view = new RecyclerViewHolder(row);
            return view;
        }       
    }
} 

6.create RecyclerViewHeadHolder :

public class RecyclerViewHeadHolder : RecyclerView.ViewHolder
{

    public TextView mDate;

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


    }

}

7. head.xml for RecyclerViewHead.

<?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="wrap_content">
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id ="@+id/mDate"
  />
</LinearLayout>
Leo Zhu
  • 15,726
  • 1
  • 7
  • 23