问题
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);
}
}
回答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>
来源:https://stackoverflow.com/questions/58070204/xamarin-android-divide-elements-on-groups-in-recyclerview