Search code examples
androidxamarinnestedrecyclerview

How to work with nested recyclerviews in xamarin?


Well, I know how to implement nested recyclerview in android studio, but i'm in a new work and we're using xamarin.. I have problems to implement the parent adapter. Any advice?

I tried to make 2 difs recyclerview, some google searchs and nothing.

class ParentAdapter(private val parents : List<ParentModel>) :    
RecyclerView.Adapter<ParentAdapter.ViewHolder>(){
private val viewPool = RecyclerView.RecycledViewPool()
override fun onCreateViewHolder(parent: ViewGroup, 
                           viewType: Int): ViewHolder {
    val v = LayoutInflater.from(parent.context)
               .inflate(R.layout.parent_recycler,parent,false)
    return ViewHolder(v)
}

override fun getItemCount(): Int {
   return parents.size
}

override fun onBindViewHolder(holder: ViewHolder, 
                                  position: Int) {
    val parent = parents[position]
    holder.textView.text = parent.title
    val childLayoutManager = LinearLayoutManager(             
    holder.recyclerView.context, LinearLayout.HORIZONTAL, false)
    childLayoutManager.initialPrefetchItemCount = 4
    holder.recyclerView.apply {
    layoutManager = childLayoutManager
    adapter = ChildAdapter(parent.children)
    setRecycledViewPool(viewPool)}}


inner class ViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
    val recyclerView : RecyclerView = itemView.rv_child
    val textView:TextView = itemView.textView}
}

The problem with the code below is in the onBindViewHolder.. in the linearlayoutmanager, i cant put the correct context.


Solution

  • i could not repeat your issue,here is my sample simple:

    outside recyclerview adapter:

    class RecyclerAdapter : RecyclerView.Adapter
    {
        // add this variable
    
        private List<ListItem> mEmails;    
    
        public RecyclerAdapter(List<ListItem> mEmails, Context context)
        {
            this.mEmails = mEmails;
    
        }
    
        public override int ItemCount
        {
            get { return mEmails.Count; }
        }
    
        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {        
                RecyclerViewHolder myHolder = holder as RecyclerViewHolder;
                LinearLayoutManager mLayoutManager = new LinearLayoutManager(myHolder.mRc.Context, LinearLayoutManager.Horizontal, false);
                mLayoutManager.InitialPrefetchItemCount = 4;
                myHolder.mRc.SetLayoutManager(mLayoutManager);
                myHolder.mRc.SetAdapter(new MyRcAdapter());
    
                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)
        {
    
                View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.row, parent, false);
    
                RecyclerViewHolder view = new RecyclerViewHolder(row);
                return view;
        }
    
        class RecyclerViewHolder1 : RecyclerView.ViewHolder
        {
    
            public TextView mName;
            public TextView mSubject;
            public TextView mMessage;      
            public RecyclerView mRc;
            public RecyclerViewHolder1(View itemView) : base(itemView)
            {
                mName = itemView.FindViewById<TextView>(Resource.Id.ore);
                mSubject = itemView.FindViewById<TextView>(Resource.Id.contratti);
                mMessage = itemView.FindViewById<TextView>(Resource.Id.resa);
                mRc = itemView.FindViewById<RecyclerView>(Resource.Id.inside_rc);
    
            }
        }
    }     
    

    and the inside recyclerview adapter :

    class MyRcAdapter : RecyclerView.Adapter
    {
        private string[] ssss = new string[] { "1", "2", "3", "1", "2", "3" };
        public override int ItemCount => ssss.Length;
    
        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            InsideHolder myHolder = holder as InsideHolder;
            myHolder.mName.Text = ssss[position];
        }
    
        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.inside, parent, false);
            InsideHolder  view = new InsideHolder(row);
            return view;
        }
    
    
        class InsideHolder : RecyclerView.ViewHolder
        {
            public TextView mName;
            public InsideHolder(View itemView) : base(itemView)
            {
                mName = itemView.FindViewById<TextView>(Resource.Id.inside);
    
            }
        }
    }