一,镶嵌在SprigView中,要导入SprigView和RecyclerView的依赖(百度)
二,布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.liaoinstan.springview.widget.SpringView android:id="@+id/springview" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="wrap_content" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </com.liaoinstan.springview.widget.SpringView> </LinearLayout>三,创建适配器
//继承RecyclerView.Adapter public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { //上下文和数据 Context context; List<MyBean.ResultBean.DataBean> list; //构造方法 public RecyclerViewAdapter(Context context) { this.context = context; } //添加数据 public void addbean(List<MyBean.ResultBean.DataBean> list) { list.addAll(list); //更新数据 notifyDataSetChanged(); } //重写三个方法 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //根据类型viewType创建ViewHolder,多条目有几个创建几个 if (viewType == 0) { View view1 = LayoutInflater.from(context).inflate(R.layout.itemre, parent, false); //返回对应的布局 return new ViewHolder(view1); } else if (viewType == 1) { View view2 = LayoutInflater.from(context).inflate(R.layout.itemre2, parent, false); return new ViewHolder2(view2); } else { View view3 = LayoutInflater.from(context).inflate(R.layout.itemre3, parent, false); return new ViewHolder3(view3); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //根据ViewHolder判断多条目显示 if (holder instanceof ViewHolder) { //直接拿到 ViewHolder viewHolder = (ViewHolder) holder; //做显示 viewHolder.itemTextview.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder.itemImageView); } else if (holder instanceof ViewHolder2) { ViewHolder2 viewHolder2 = (ViewHolder2) holder; viewHolder2.item2Textview.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder2.item2ImageView1); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),viewHolder2.item2ImageView2); } else { ViewHolder3 viewHolder3 = (ViewHolder3) holder; viewHolder3.item3Textview.setText(list.get(position).getTitle()); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder3.item3ImageView1); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),viewHolder3.item3ImageView2); ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s03(),viewHolder3.item3ImageView3); } } @Override public int getItemCount() { return list.size(); } //还需要重写方法 // 对应布局类型 @Override public int getItemViewType(int position) { if (!TextUtils.isEmpty(list.get(position).getThumbnail_pic_s03())){ return 2; }else if (!TextUtils.isEmpty(list.get(position).getThumbnail_pic_s02())){ return 1; }else{ return 0; } } //使用buttonknife自动创建viewHolder,继承RecyclerViewHolder static class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.item_image_view) ImageView itemImageView; @BindView(R.id.item_textview) TextView itemTextview; ViewHolder(View view) { //给一个super super(view); ButterKnife.bind(this, view); } } static class ViewHolder2 extends RecyclerView.ViewHolder { @BindView(R.id.item2_image_view1) ImageView item2ImageView1; @BindView(R.id.item2_image_view2) ImageView item2ImageView2; @BindView(R.id.item2_textview) TextView item2Textview; ViewHolder2(View view) { super(view); ButterKnife.bind(this, view); } } static class ViewHolder3 extends RecyclerView.ViewHolder { @BindView(R.id.item3_image_view1) ImageView item3ImageView1; @BindView(R.id.item3_image_view2) ImageView item3ImageView2; @BindView(R.id.item3_image_view3) ImageView item3ImageView3; @BindView(R.id.item3_textview) TextView item3Textview; ViewHolder3(View view) { super(view); ButterKnife.bind(this, view); } } }四,适配器中用到的子布局很简单,在此不做介绍了
五,拿到接口,封装数据bean
六,获取数据
1,创建P层
public class MainActivityPresenter { //实例model MainActivityModel mainActivityModel; //实例view MainActivityView mainActivityView; //构造方法 public MainActivityPresenter(MainActivityView mainActivityView){ //view接口传过来他就持有MainActivityView,然后定义出来,构造 this.mainActivityView = mainActivityView; this.mainActivityModel = new MainActivityModel(); } //获取数据的方法,上拉刷新和下拉加载 public void onfresh(boolean up){ mainActivityModel.onfresh(up, new MainActivityModel.ModelCallBack() { @Override public void success(MyBean myBean) { //通过view的接口往回调 mainActivityView.success(myBean); } @Override public void failure(Exception e) { mainActivityView.fasle(e); } }); } //上拉加载需要一个page参数 /*public void onloadmore(int page){ }*/2,创建model层
public class MainActivityModel { //提供对应的上拉下拉方法 //up为true就是下拉刷新,为false就是上拉加载 public void onfresh(boolean up, final ModelCallBack modelCallBack){ //拿封装好的网络请求数据,第一个参数map类型,不需要,第二个,请求路劲,第三个回调,泛型是你的bean指定类型 OkhttpUtils.getInstance().asy(null, "http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653", new AbstractUiCallBack<MyBean>() { @Override public void success(MyBean myBean) { //成功就调到数据了,然后要回调到presenter里 modelCallBack.success(myBean); } @Override public void failure(Exception e) { modelCallBack.failure(e); } }); } //创建回调接口 public interface ModelCallBack{ public void success(MyBean myBean); public void failure(Exception e); } //需要判断是上拉还是下拉,就需要写两个方法,给个boon值用来判断,up为true是 /*public void onloadmore(int page){ }*/ }
3,view层
public interface MainActivityView { //数据成功回调的方法,需要数据参数 public void success(MyBean myBean); //失败,封装的接口(okhttp)里回调一个Exception public void fasle(Exception e); }七,Activity
//实现View接口 public class MainActivity extends Activity implements MainActivityView { //初始化控件 RecyclerView recyclerview; SpringView springview; private MainActivityPresenter mainActivityPresenter; private RecyclerViewAdapter recyclerViewAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 recyclerview = findViewById(R.id.recyclerview); springview = findViewById(R.id.springview); //获取数据,使用mvp模式,创建p层,实例化,presenter回调需要把当前的view接口传过去 mainActivityPresenter = new MainActivityPresenter(this); //MainActivityPresenter回调view,需要定义一个view的接口 //实例化适配器 recyclerViewAdapter = new RecyclerViewAdapter(this); //布局管理器,一参上下文,二参方向 LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); //给RecyclerView设置管理器 recyclerview.setLayoutManager(layoutManager); //设置适配器 recyclerview.setAdapter(recyclerViewAdapter); //springview添加头尾部 springview.setHeader(new DefaultHeader(this)); springview.setFooter(new DefaultFooter(this)); //特别要注意springview的监听 springview.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { //实例化presenter调用precenter里的方法,precenter掉model mainActivityPresenter.onfresh(true); } @Override public void onLoadmore() { mainActivityPresenter.onfresh(false); } }); //给一个默认显示 mainActivityPresenter.onfresh(true); } @Override public void success(MyBean myBean) { //最后要显示数据,更新数据源 if(springview != null){ springview.onFinishFreshAndLoad(); } recyclerViewAdapter.addbean(myBean.getResult().getData()); } @Override public void fasle(Exception e) { Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show(); } }
八,请求数据用到的封装好的OKHTTP
九,多条目布局用Imageloader(设置权限和配置)
//配置Imageloader public class MyApps extends Application{ @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration .Builder(this) .build(); ImageLoader.getInstance().init(imageLoaderConfiguration); //然后要到清单文件中配置name和网络权限 } }
本文介绍如何在Android应用中将SprigView与RecyclerView相结合,实现流畅的上下拉刷新和加载更多功能。包括依赖导入、布局配置、自定义适配器及ViewHolder,以及采用MVP模式进行数据获取和展示。
1933

被折叠的 条评论
为什么被折叠?



