【问题标题】:Xamarin Android: Divide elements on groups in RecyclerViewXamarin Android:在 RecyclerView 中按组划分元素
【发布时间】:2020-01-23 23:34:08
【问题描述】:

大家好,我叫谷口。

我已经实现了一个 recyclerview,我希望将这个 recyclerview 上的项目划分为组

有一种方法可以按键划分itens,但我需要创建多个xmls和viewholder,但我不知道该怎么做。

我怎样才能使用一个键来划分recyclerview项目中的元素呢?

我找到了这个文档,但它是在 java 上的。

Divide elements on groups in RecyclerView

有人有 C# 的例子吗?

我的 recyclerview 适配器:

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

}

我在哪里调用回收站:

[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!!" });

        }
    }

我的 recyclerview 持有者:

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

【问题讨论】:

    标签: c# xamarin.android


    【解决方案1】:

    这是根据您的代码的示例:

    1.处理数据,这里只是同一日期的数据组合,不按时间排序,当然你也可以排序。

    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.创建一个ListItem类:

    public abstract class ListItem
    {
    
        public static  int TYPE_HEADER = 0;
        public static  int TYPE_CONTENT = 1;
    
        abstract public int getType();
    }
    

    3.创建放日期的DateItem类:

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

    4.让你的Email扩展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.在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.创建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 用于 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>
    

    【讨论】:

      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2011-11-27
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多