具有多种视图类型和数据源的RecyclerView

时间:2018-04-16 09:07:38

标签: android android-recyclerview xamarin.android

我正在使用recyclerView,我成功地膨胀了两个视图,但每个视图内容都来自不同的json数据类型。我尝试在适配器中传递两种数据类型,但它们没有正确绑定

  • 源代码

    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 {     public string mBoundString;     public readonly查看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 {     public string mBoundString;     public readonly查看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);
    
    
    }
    

3 个答案:

答案 0 :(得分:6)

您应该仅将数据合并到一个数据源。你可以这样试试:

  1. 创建数据源类

    csvfilenames <- list.files("/Users/carlos/Desktop/TestCSVFilesToMerge/",
                       pattern="*.csv", all.files=FALSE, full.names=FALSE) #creates a list with the file names
    csvfilenames
    
    for(i in 1:length(csvfilenames)) 
    
    {
    a=csvfilenames[i]
    temp1<-read.csv(file=paste("/Users/carlos/Desktop/TestCSVFilesToMerge/",a,sep=""), sep=";", header=T)
    temp2<-cbind("FileName"=a,temp1[,1:ncol(temp1)]) #add a column called FileName in position 1
    temp[a]=temp2 
    }
    output=rbind(temp[[a]])
    output
    
  2. 现在将两个数据源合并为一个

    public class Data {
       int type; // 1 is article and 2 is youtubeitem
       public Article article;
       public YouTubeItem youTubeItem;
    }
    
  3. 更改适配器的构造函数

    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;
    }
    
  4. 更改获取项目计数

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

    public override int ItemCount
    {
    
        get
        {
            return datas.Count();
        }
    }
    
  6. 已编辑:适用于合并随机方法

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

    希望有所帮助

答案 1 :(得分:0)

让一个interface实现您的数据pojo类,如下所示..

public interface Parent{
}

然后pojo类喜欢

public class User implements Parent{
    private String name,addres;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddres() {
        return addres;
    }

    public void setAddres(String addres) {
        this.addres = addres;
    }
}

然后将所有数据添加到父列表中并绑定到适配器中。 适配器根据pojo类绑定数据,如下所示..

public class SearchListAdapter extends ArrayAdapter<Parent> {
    Context context;
    Parent parent[] = null;
        public SearchListAdapter(Context context, int layoutResourceId, Parent[] parent) {
        super(context, layoutResourceId, parent);
        this.context = context;
        this.parent = parent;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        final View outerContainer = inflater.inflate(R.layout.food_list_item, parent, false);
        if (this.parent != null) {
            Parent temp = this.parent[position];
            if (temp instanceof FoodItem) {
                final FoodItem item = (FoodItem) temp;
            }
        }   
    }
}

答案 2 :(得分:0)

使用此函数合并数据并在适配器中使用它:

SELECT * FROM Sites WHERE SiteId = 59;