具有多种视图类型和数据源的RecyclerView [英] RecyclerView with multiple view types and data source

查看:71
本文介绍了具有多种视图类型和数据源的RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用recyclerView,并且成功放大了两个视图,但是每个视图内容都来自不同的json数据类型.我试图在适配器中传递两个数据类型,但它们没有正确绑定

I am working with a recyclerView and i succeeded in inflating two views but each view content comes from different json data types. i tried passing the two datatypes in the adapter but they are not properly binded

  • 源代码

  • source code

公共类SimpleStringRecyclerViewAdapter:RecyclerView.Adapter {

public class SimpleStringRecyclerViewAdapter : RecyclerView.Adapter {

private Article[] mValues;
private List<YouTubeItem> mValues2;

Context context;

public SimpleStringRecyclerViewAdapter(Context context, Article[] items, List<YouTubeItem> item )
{
    this.context = context;
    mValues = items;
    mValues2 = item;
}

public override int ItemCount
{

    get
    {
       return mValues.Count() + mValues2.Count();
    }
}

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
    if (holder is SimpleViewHolder)
    try
    {
        Article item = mValues[position];
        var simpleHolder = holder as SimpleViewHolder;

        simpleHolder.mTxtView.Text = Android.Text.Html.FromHtml(item.Title).ToString();
        simpleHolder.mTxtView2.Text = item.Description;


        using (var imageView = simpleHolder.mImageView)
        {
            string url = Android.Text.Html.FromHtml(item.UrlToImage).ToString();

            //Download and display image
            UrlImageViewHelper.SetUrlDrawable(imageView,
                url, Resource.Drawable.cheese_1
                );



        }
        //    simpleHolder.mprogressbar.Visibility = ViewStates.Gone;
    }
    catch (Exception e)
    {
        //Toast.MakeText(this.context, e.ToString(), ToastLength.Long).Show();
    }
    else
    {
        try
        {
            YouTubeItem item = mValues2[position];
            var simpleHolder = holder as SimpleViewHolder2;

            simpleHolder.mTxtView.Text = Android.Text.Html.FromHtml(item.Title).ToString();
            // simpleHolder.mTxtView2.Text = item.DescriptionShort;


            using (var imageView = simpleHolder.mImageView)
            {
                string url = Android.Text.Html.FromHtml(item.MaxResThumbnailUrl).ToString();

                //Download and display image
                UrlImageViewHelper.SetUrlDrawable(imageView,
                    url, Resource.Drawable.cheese_1
                    );



            }
        }
        catch (Exception e)
        {
            //Toast.MakeText(this.context, e.ToString(), ToastLength.Long).Show();
        }

    }
}

public override int GetItemViewType(int position)
{
    if ((position % 2) == 0)
    {
        //Even number
        return Resource.Layout.List_Item;
    }

    else
    {
        //Odd number
        return Resource.Layout.VideoList;
    }
}



public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
    if (viewType == Resource.Layout.List_Item)
    {
        View view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.List_Item, parent, false);
        view.SetBackgroundColor(Color.White);


        SimpleViewHolder holder = new SimpleViewHolder(view);
        // holder.mprogressbar = view.FindViewById<ProgressBar>(Resource.Id.progressBar);
        // holder.mprogressbar.Visibility = ViewStates.Visible;


        //Showing loading progressbar

        return holder;
    }
    else
    {
        View view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.VideoList, parent, false);
        view.SetBackgroundColor(Color.White);
        SimpleViewHolder2 holder = new SimpleViewHolder2(view);

        return holder;
    }

}

}

公共类SimpleViewHolder:RecyclerView.ViewHolder { 公共字符串mBoundString; 公共只读视图mView; 公共只读ImageView mImageView; 公共只读TextView mTxtView; 公共只读TextView mTxtView2; //公共ProgressBar mprogressbar;

public class SimpleViewHolder : RecyclerView.ViewHolder { public string mBoundString; public readonly View mView; public readonly ImageView mImageView; public readonly TextView mTxtView; public readonly TextView mTxtView2; // public ProgressBar mprogressbar;

public SimpleViewHolder(View view) : base(view)
{
    mView = view;
    mImageView = view.FindViewById<ImageView>(Resource.Id.avatar);
    mTxtView = view.FindViewById<TextView>(Resource.Id.Text1);
    mTxtView2 = view.FindViewById<TextView>(Resource.Id.Text2);
    //   mprogressbar = view.FindViewById<ProgressBar>(Resource.Id.progressBar);


}




public override string ToString()
{
    return base.ToString() + " '" + mTxtView.Text;

}

} 公共类SimpleViewHolder2:RecyclerView.ViewHolder { 公共字符串mBoundString; 公共只读视图mView; 公共只读ImageView mImageView; 公共只读TextView mTxtView; 公共只读TextView mTxtView2;

} public class SimpleViewHolder2 : RecyclerView.ViewHolder { public string mBoundString; public readonly View mView; public readonly ImageView mImageView; public readonly TextView mTxtView; public readonly TextView mTxtView2;

public SimpleViewHolder2(View view) : base(view)
{
    mView = view;
    mImageView = view.FindViewById<ImageView>(Resource.Id.videoavatar);
    mTxtView = view.FindViewById<TextView>(Resource.Id.videoText1);
    //   mprogressbar = view.FindViewById<ProgressBar>(Resource.Id.progressBar);


}

推荐答案

您应仅将数据合并到一个数据源.您可以尝试这种方式:

You should merge data to one data source only. You can try this way:

  1. 创建数据源类

  1. Create data source class

public class Data {
   int type; // 1 is article and 2 is youtubeitem
   public Article article;
   public YouTubeItem youTubeItem;
}

  • 现在将两个数据源合并为一个数据

  • Now merge two data source to only one

    public List<Data> merge(Articel[] articles, List<YouTubeItem> items) {
        List<Data> datas = new ArrayList<>();
        for(Article article : articles) {
           Data data = new Data();
           data.article = article;
           data.youTubeItem = null;
           data.type = 1;
           datas.add(data);
        }
    
        for(YouTubeItem item : items) {
           Data data = new Data();
           data.article = null;
           data.youTubeItem = item;
           data.type = 2;
           datas.add(data);
        }
    
       return datas;
    }
    

  • 更改适配器的构造函数

  • Change constructor of adapter

    private List<Data> datas;
    
    public SimpleStringRecyclerViewAdapter(Context context, List<Data> datas )
    {
      this.datas = datas;
    }
    

  • 更改获取项目数

  • Change get Item count

    public override int ItemCount
    {
    
        get
        {
            return datas.Count();
        }
    }
    

  • 更改getViewType

  • Change getViewType

    public override int GetItemViewType(int position)
    {
       if (datas.get(position).type == 1)
       {
            return Resource.Layout.List_Item;
       }
    
       else
       {
           return Resource.Layout.VideoList;
       }
    }
    

  • 已编辑:用于合并随机方法

     public List<Data> mergeRandom(Articel[] articles, List<YouTubeItem> items) {
         List<Data> datas = new ArrayList<>();
    
         List<Integer> random = new ArrayList<>();
         int maxLength = articles.length + items.size(); 
         for(int i = 0; i< maxLength; i++) { 
            random.add(i);
         }
    
         while (random.size() > 0) {
            // get random item
            int index = new Random().nextInt(random.size());
            int position = random.get(index);
    
            if(position <= article.length - 1) {
                Data data = new Data();
                data.article = articles[position];
                data.youTubeItem = null;
                data.type = 1;
                datas.add(data);
            } else {
                Data data = new Data();
                data.article = null;
                data.youTubeItem = items.get(position - article.length);
                data.type = 2;
                datas.add(data);
            }
    
            random.remove(index);
        }
    
        return datas;
     }
    

    用于合并奇偶方法

    List<Data> mergeOddEven(Articel[] articles, List<YouTubeItem> items) {
        List<Data> datas = new ArrayList<>();
    
        int articleIndex = 0;
        int youtubeIndex = 0;
        int length = articles.length + items.size();
    
        for(int i = 0; i< length; i++) {
            if(articleIndex >= articles.length || youtubeIndex >= items.size()) {
                if(articleIndex < articles.length) {
                    for(int j = articleIndex; j < articles.length ; j++) {
                       Data data = new Data();
                       data.article = articles[j];
                       data.youTubeItem = null;
                       data.type = 1;
                       datas.add(data);
    
                    }
                } else {
                    for(int j = youtubeIndex; j < items.size() ; j++) {
                       Data data = new Data();
                       data.article = null;
                       data.youTubeItem = items.get(j);
                       data.type = 2;
                       datas.add(data);
    
                    }
                }
    
                break;
            }
    
    
            if(i % 2 == 0) {
                Data data = new Data();
                data.article = articles[articleIndex];
                data.youTubeItem = null;
                data.type = 1;
                datas.add(data);
    
                articleIndex++;
            } else {
                Data data = new Data();
                data.article = null;
                data.youTubeItem = tems.get(youtubeIndex);
                data.type = 2;
                datas.add(data);
    
                youtubeIndex++;
            }
        }
    
        return datas;
    }
    

    希望有帮助

    这篇关于具有多种视图类型和数据源的RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆