Android XRecyclerView实现多条目加载

本文实例为大家分享了Android实现多条目加载展示的具体代码,供大家参考,具体内容如下

展示效果

这里写图片描述

依赖

testCompile 'junit:junit:4.12'
 compile 'com.hjm:BottomTabBar:1.1.1'
 compile 'com.android.support:design:23.4.0'
 compile 'com.android.support:mediarouter-v7:25.0.0'
 compile 'com.android.support:appcompat-v7:25.0.0'
 compile 'com.android.support:recyclerview-v7:25.0.0'
 compile 'com.jcodecraeer:xrecyclerview:1.3.2'
 compile 'com.squareup.okio:okio:1.5.0'
 compile 'com.squareup.okhttp3:okhttp:3.2.0'
 compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
 compile files('libs/gson-2.3.1.jar')
 compile files('libs/universal-image-loader-1.9.3.jar')
 compile 'com.youth.banner:banner:1.4.9'
 compile 'com.github.bumptech.glide:glide:3.7.0'

添加配置

<uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.VIBRATE" />

代码区

ZhuyeActivity(首页布局含TabLayout)

public class ZhuyeActivity extends AppCompatActivity {
 private ViewPager viewpager;
 private TabLayout tablayout;
 private FragmentAdapter adapter;
 private List<Fragment> fragments;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_zhuye);
  viewpager=(ViewPager)findViewById(R.id.viewpager);
  tablayout=(TabLayout)findViewById(R.id.tablayout);
  fragments=new ArrayList<Fragment>();
  OneFragment oneFragment = new OneFragment();
  TwoFragment twoFragment = new TwoFragment();
  ThreeFragment threeFragment = new ThreeFragment();
  FourFragment fourFragment = new FourFragment();
  fragments.add(oneFragment);
  fragments.add(twoFragment);
  fragments.add(threeFragment);
  fragments.add(fourFragment);
  adapter = new FragmentAdapter(getSupportFragmentManager(),fragments);
  viewpager.setAdapter(adapter);
  tablayout.setupWithViewPager(viewpager);
 }
}

activity_zhuye(首页布局xml文件)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_zhuye"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="test.bwie.com.ykmn.ZhuyeActivity">
 <RelativeLayout
  android:id="@+id/app_top"
  android:layout_width="match_parent"
  android:layout_height="50dp"
  android:background="@color/colorPrimaryDark"
  >
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="首页"
   android:textSize="25dp"
   android:textColor="@color/colorBai"
   android:layout_centerInParent="true"
   />
 </RelativeLayout>
 <android.support.design.widget.TabLayout
  android:layout_width="match_parent"
  android:layout_height="40dp"
  android:id="@+id/tablayout"
  android:layout_below="@id/app_top"
  >
 </android.support.design.widget.TabLayout>

 <android.support.v4.view.ViewPager
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/viewpager"
  android:layout_below="@id/tablayout"
  />
</RelativeLayout>

OneFragment(首页以第一个fragment 里面的API是自行供应的接口)

public class OneFragment extends Fragment {
 private XRecyclerView xr;
 private List<String> list = new ArrayList<>();
 //获取数据的开始
 private int curr;
 private XRAdapter adapter;
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.y1, null, false);
  //初始化xr控件
  xr=(XRecyclerView)view.findViewById(R.id.xre_xrv);

  //加布局管理器
  LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
  layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  xr.setLayoutManager(layoutManager);

  getData(API.TYPE_HOME,1);
  xr.setLoadingListener(new XRecyclerView.LoadingListener() {

    /*下拉刷新*/

   @Override
   public void onRefresh() {
    curr=0;
    list.clear();
    getData(API.TYPE_HOME,curr);
    xr.refreshComplete();
   }

    /*上拉加载*/

   @Override
   public void onLoadMore() {
    /*curr++;
    getData(API.TYPE_HOME,curr);
    xr.refreshComplete();*/
//    xr.loadMoreComplete();
   }
  });
  return view;
 }
 private void getData(String url,int curr){
  OkHttp3Utils.getInstance().doGet(url, new GsonObjectCallback<MyGsonFr>() {
   @Override
   public void onUi(MyGsonFr myGsonFr) {
    XRAdapter mxradapter=new XRAdapter(getActivity(),myGsonFr.getTop_stories());
    xr.setAdapter(mxradapter);
   }

   @Override
   public void onFailed(Call call, IOException e) {

   }
  });
 }
}

y1(OneFragment的布局代码xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >
 <com.jcodecraeer.xrecyclerview.XRecyclerView
  android:id="@+id/xre_xrv"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
 </com.jcodecraeer.xrecyclerview.XRecyclerView>
</RelativeLayout>

XRAdapter(适配器对条目)

public class XRAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 List<MyGsonFr.TopStoriesBean> lists;
 Context mcontext;
 ArrayList mlist;
 private enum Item_Type{
  Typeone,Typetwo,Typethree,Typefour,Typefive,Typesix,Typeseven;
 }
 //创建适配器有参构造

 public XRAdapter(Context mcontext, List<MyGsonFr.TopStoriesBean> data) {
  this.lists = data;
  this.mcontext = mcontext;
 }

 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  if(viewType==Item_Type.Typeone.ordinal()){
   View mView = LayoutInflater.from(mcontext).inflate(R.layout.recycle_item_a, null);
   ViewHolderA viewHolder = new ViewHolderA(mView);
   return viewHolder;
  }else if(viewType==Item_Type.Typetwo.ordinal()){
   View mView = LayoutInflater.from(mcontext).inflate(R.layout.recycle_item_b, null);
   ViewHolderB viewHolder = new ViewHolderB(mView);
   return viewHolder;
  }
  return null;
 }

 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  if (holder instanceof ViewHolderA){
   mlist=new ArrayList();
   for (int i=0;i<lists.size();i++){
    mlist.add(lists.get(i).getImage());
   }
   //设置图片加载器
   ((ViewHolderA)holder).mbanner.setImageLoader(new GlideImageLoader());
   ((ViewHolderA)holder).mbanner.setImages(mlist);
   ((ViewHolderA)holder).mbanner.start();
  }else if(holder instanceof ViewHolderB){
   mlist=new ArrayList();
   for (int i=0;i<lists.size();i++){
    mlist.add(lists.get(i).getImage());
   }
   ((ViewHolderB)holder).re.setLayoutManager(new LinearLayoutManager(mcontext));
   ((ViewHolderB)holder).re.setAdapter(new ViewHolderBa(lists,mcontext));
  }
 }

 @Override
 public int getItemCount() {
  return 2;
 }

 @Override
 public int getItemViewType(int position) {
  if(position==0){
   return Item_Type.Typeone.ordinal();
  }else if(position==1){
   return Item_Type.Typetwo.ordinal();
  }
  return -1;
 }
 class ViewHolderA extends RecyclerView.ViewHolder{
  private Banner mbanner;
  public ViewHolderA(View itemView) {
   super(itemView);
   mbanner=(Banner)itemView.findViewById(R.id.mybanner);
  }
 }
 class ViewHolderB extends RecyclerView.ViewHolder{
  private RecyclerView re;
  public ViewHolderB(View itemView) {
   super(itemView);
   re = (RecyclerView) itemView.findViewById(R.id.id_recyclerview);
  }
 }
}

recycle_item_a(banner轮播xml)

<?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="150dp">
 <com.youth.banner.Banner
  android:id="@+id/mybanner"
  android:layout_width="match_parent"
  android:layout_height="150dp">
 </com.youth.banner.Banner>
</LinearLayout>

recycle_item_a(Recyclerview布局xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:orientation="vertical"
 android:layout_height="match_parent">
 <android.support.v7.widget.RecyclerView
  android:id="@+id/id_recyclerview"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  />
</LinearLayout>

ViewHolderBa(Recyclerview小适配器)

public class ViewHolderBa extends RecyclerView.Adapter<ViewHolderBa.MyViewHolder>{

 List<MyGsonFr.TopStoriesBean> lists;
 Context mc;

 public ViewHolderBa(List<MyGsonFr.TopStoriesBean> lists, Context mc) {
 this.lists = lists;
 this.mc = mc;
 }

 @Override
 public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mc).inflate(R.layout.item_home, parent, false));
 return holder;
 }

 @Override
 public void onBindViewHolder(MyViewHolder holder, int position) {
 holder.tv.setText(lists.get(position).getTitle());
 ImageLoader instance = ImageLoader.getInstance();
 instance.displayImage(lists.get(position).getImage(),holder.img);
 }

 @Override
 public int getItemCount() {
 return lists.size();
 }

 class MyViewHolder extends RecyclerView.ViewHolder {

 TextView tv;
 ImageView img;

 public MyViewHolder(View view) {
  super(view);
  tv = (TextView) view.findViewById(R.id.text_a1);
  img = (ImageView) view.findViewById(R.id.img_a1);
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android WebView加载html5介绍

    Android设备多分辨率的问题 Android浏览器默认预览模式浏览 会缩小页面 WebView中则会以原始大小显示 Android浏览器和WebView默认为mdpi.hdpi相当于mdpi的1.5倍 ldpi相当于0.75倍 三种解决方式:1 viewport属性 2 CSS控制 3 JS控制 1 viewport属性放在HTML的<meta>中 Html代码 复制代码 代码如下: <SPANstyle="FONT-SIZE: x-small"> <

  • Android下拉刷新上拉加载控件(适用于所有View)

    前面写过一篇关于下拉刷新控件的文章下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅如此,我已经把它改成了对所有View都通用!可以随心所欲使用这两个功能~~ 我做了一个大集合的demo,实现了ListView.GridView.ExpandableListView.ScrollView.WebView.ImageView.TextView的下拉刷新和上拉加载.后面会提供demo的

  • Android中Glide加载库的图片缓存配置究极指南

    零.选择Glide 为什么图片加载我首先推荐Glide? 图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织square的picasso,google推荐的glide到FaceBook推出的fresco.这些我前前后后都体验过,那么面对这么多的框架,该如何选择呢?下面简单分析下我的看法. afinal和Xuils在github上作者已经停止维护了,开源社区最新的框架要属KJFra

  • Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而Ima

  • Android中使用RecyclerView实现下拉刷新和上拉加载

    推荐阅读:使用RecyclerView添加Header和Footer的方法                       RecyclerView的使用之HelloWorld RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好.本文给大家介绍如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterVie

  • android动态加载布局文件示例

    一.布局文件part.xml: 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="

  • android异步加载图片并缓存到本地实现方法

    在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片. 首先看一下异步加载缓存本地代码: 复制代码 代码如下: public

  • Android关于Glide的使用(高斯模糊、加载监听、圆角图片)

    高斯模糊.加载监听.圆角图片这些相信大家都很熟悉,那如何实现这些效果,请大家参考本文进行学习. 1.引用 compile 'com.github.bumptech.glide:glide:3.7.0' 2.加载图片 2.1 基本加载 Glide.with(context)     .load(url)     .into(imageView); 2.2 设置加载中和加载失败的情况 Glide.with(context) .load(url) .placeholder(R.drawable.loa

  • Android实现加载广告图片和倒计时的开屏布局

    这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码. 具体实现代码如下: package cn.waps.extend; import android.app.Activity; import android.content.Context; import android.content.res.Configuration;

  • Android加载大分辨率图片到手机内存中的实例方法

    还原堆内存溢出的错误首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView,然后按照常规的方式,使用BitmapFactory加载一张照片并使用一个ImageView展示. 代码如下: 复制代码 代码如下: btn_loadimage.setOnClickListener(new View.OnClickListener() { @Override   

随机推荐