Как работать с вложенными переработчиками в xamarin? - PullRequest
0 голосов
/ 01 октября 2019

Ну, я знаю, как реализовать вложенный реселлер в Android Studio, но я в новой работе, и мы используем xamarin. У меня проблемы с реализацией родительского адаптера. Любой совет?

Я пытался сделать 2 различных утилита просмотра, некоторые поиски в Google и ничего.

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

Проблема с кодом ниже находится в onBindViewHolder .. в linearlayoutmanager, я не могупоставить правильный контекст.

1 Ответ

1 голос
/ 02 октября 2019

Я не могу повторить вашу проблему, вот мой простой пример:

внешний адаптер для повторного использования:

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

        }
    }
}     

и внутренний адаптер для повторного просмотра:

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

        }
    }
}
...