MVP框架+RXJava+reftorfit请求网络数据+XRecycleView多条目展示(banner轮播+条目展示、刷新加载)、点击事件+fresco图片加载

今天把这些天常用的知识点总结了一下,写了一篇demon

MVP框架+RXJava+reftorfit请求网络数据+XRecycleView多条目展示(banner轮播+条目展示)、点击事件+fresco图片加载,总体来说,这一套框架还是非常实用的,今天就给大家带来代码的展示:

首先进行一系列的配置,这里边我用到了butterKnife,不会配置的人,可以点击:http://blog.csdn.net/pentablet/article/details/78351364

导入依赖:在app的build中,注释都已经写好了,可以看看

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
    // recycleView
    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'
    // reftorfit
    compile 'com.android.support:design:23.4.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.1'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    // fresco
    compile 'com.facebook.fresco:fresco:0.11.0'
    // butterknife
    compile 'com.jakewharton:butterknife:8.2.1'
    apt 'com.jakewharton:butterknife-compiler:8.2.1'
    // banner
    compile 'com.youth.banner:banner:1.4.9'
    compile 'com.github.bumptech.glide:glide:3.7.0'
}

首先做一些准备工作,初始化fresco,在

MyApp.class中, 

package app; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco;
 /** 
* Created by 笔片 on 2017/11/23. 
*/ 
public class MyApp extends Application{ 
    @Override public void onCreate() { 
        super.onCreate();
         Fresco.initialize(this);
     } 
}

写完后记得在清单文件中进行配置 

GlideImaGlideImageLoader.class利用Glide往banner中添加图片

package bean;

import android.content.Context;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.youth.banner.loader.ImageLoader;

/**
 * Created by 笔片 on 2017/11/23.
 */
public class GlideImaGlideImageLoader extends ImageLoader {
    public void displayImage(Context context, Object path, ImageView imageView) {
        Glide.with(context).load(path).into(imageView);
    }
} 

网络请求时,写一个Api类,把要请求的网络接口放进去 

Api.class: 

package api;

/**
 * Created by 笔片 on 2017/11/23.
 */
public class Api {
    public static final String URL = "http://result.eolinker.com/";
} 


定义一个接口ApiServices,利用RXjava请求

package intent;

import bean.User;
import retrofit2.http.GET;
import rx.Observable;

/**
 * Created by 笔片 on 2017/11/23.
 */
public interface ApiServices {
    @GET("iYXEPGn4e9c6dafce6e5cdd23287d2bb136ee7e9194d3e9?uri=vedio")
    Observable<User> getNoParams();
} 


下面就是布局文件了main_activity.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_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bwie.test.yuetextthree.MainActivity">

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/mxr"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</RelativeLayout> 


list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/img"
        android:layout_width="130dp"
        android:layout_height="130dp"
        fresco:placeholderImage="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="woshi" />
</LinearLayout>

recycle_banner_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.youth.banner.Banner
        android:id="@+id/banner"
        android:layout_width="match_parent"
        android:layout_height="200dp"></com.youth.banner.Banner>
</LinearLayout>


接下来就是java代码了,USer类,就是接口数据封装的bean类,

User.class:

package bean;

import java.util.List;

/**
 * Created by 笔片 on 2017/11/23.
 */
public class User {
  
    private int code;
    private String msg;
    private List<DataBean> data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        
        private String content;
        private int id;
        private String image_url;
        private String title;
        private int type;
        private String vedio_url;

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getImage_url() {
            return image_url;
        }

        public void setImage_url(String image_url) {
            this.image_url = image_url;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        public String getVedio_url() {
            return vedio_url;
        }

        public void setVedio_url(String vedio_url) {
            this.vedio_url = vedio_url;
        }
    }
} 


接下来机试利用Mvp模式,请求网络数据:

Iview:

package view;

import bean.User;

/**
 * Created by 笔片 on 2017/11/23.
 */
public interface Iview {
    void getJson(User user);
} 

适配器HomeAdapter.class:

package model;

import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.bwie.test.yuetextthree.R;
import com.facebook.drawee.view.SimpleDraweeView;
import com.youth.banner.Banner;

import java.util.ArrayList;
import java.util.List;

import bean.GlideImaGlideImageLoader;
import bean.User;

/**
 * Created by 笔片 on 2017/11/23.
 */
public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    User mDatas;
    Context context;
    ArrayList mlist;

    public HomeAdapter(User mDatas, Context context) {
        this.mDatas = mDatas;
        this.context = context;
    }

    //枚举类型
    private enum Item_Type {Typeone, Typetwo}

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

    /**
     * 绑定数据:可以直接拿到已经绑定控件的Viewholder对象 * * @param holder * @param position
     */
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ViewHolderA) {
            mlist = new ArrayList();
            for (int i = 0; i < mDatas.getData().size(); i++) {
                mlist.add(mDatas.getData().get(i).getImage_url());
            }
            //设置图片加载器
            ((ViewHolderA) holder).mbanner.setImageLoader(new GlideImaGlideImageLoader());
            ((ViewHolderA) holder).mbanner.setImages(mlist);
            ((ViewHolderA) holder).mbanner.start();
        } else if (holder instanceof ViewHolderB) {
            ((ViewHolderB) holder).tv.setText(mDatas.getData().get(position).getTitle());
            String imgURL = mDatas.getData().get(position).getImage_url();
            Uri uri = Uri.parse(imgURL);
            ((ViewHolderB) holder).img.setImageURI(uri);
        }
        // 如果设置了回调,则设置点击事件 
        if (mOnItemClickLitener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemClick(holder.itemView, pos);
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
                    return false;
                }
            });
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return 0;
        } else {
            return 1;
        }
    }

    class ViewHolderA extends RecyclerView.ViewHolder {
        public Banner mbanner;

        public ViewHolderA(View itemView) {
            super(itemView);
            mbanner = (Banner) itemView.findViewById(R.id.banner);
        }
    }

    class ViewHolderB extends RecyclerView.ViewHolder {
        public SimpleDraweeView img;
        public TextView tv;

        public ViewHolderB(View itemView) {
            super(itemView);
            img = (SimpleDraweeView) itemView.findViewById(R.id.img);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }

    // 设置点击事件 
    public interface OnItemClickLitener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    private OnItemClickLitener mOnItemClickLitener;

    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }
} 


Imodel.class:

package model;

/**
 * Created by 笔片 on 2017/11/23.
 */
public interface Imodel {
    void getUrl(String url);
} 

OnFinishLisenter.class:

package model;

import bean.User;

/**
 * Created by 笔片 on 2017/11/23.
 */
public interface OnFinishLisenter {
    void OnLinsenter(User bean);
} 


usermodel.class:

package model;

import bean.User;
import intent.ApiServices;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by 笔片 on 2017/11/23.
 */
public class usermodel implements Imodel {
    OnFinishLisenter onFinishLisenter;

    public void setOnFinishLisenter(OnFinishLisenter onFinishLisenter) {
        this.onFinishLisenter = onFinishLisenter;
    }

    @Override
    public void getUrl(String url) {
        // 创建Retrofit 
        Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
        // 通过动态代理得到网络接口对象
        ApiServices apiservice = retrofit.create(ApiServices.class);
        Observable<User> user = apiservice.getNoParams();
        user.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<User>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(User user) {
                onFinishLisenter.OnLinsenter(user);
            }
        });
    }
} 


userpresenter.class:

package presenter;

import bean.User;
import model.OnFinishLisenter;
import model.usermodel;
import view.Iview;

/**
 * Created by 笔片 on 2017/11/23.
 */
public class userpresenter {
    Iview iview;
    usermodel usermodel;

    public userpresenter(final Iview iview) {
        this.iview = iview;
        this.usermodel = new usermodel();
        usermodel.setOnFinishLisenter(new OnFinishLisenter() {
            @Override
            public void OnLinsenter(User bean) {
                iview.getJson(bean);
            }
        });
    }

    public void getUrl(String url) {
        usermodel.getUrl(url);
    }
} 


最后就是Main_Activity.class:

package com.bwie.test.yuetextthree;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.jcodecraeer.xrecyclerview.XRecyclerView;

import api.Api;
import bean.User;
import butterknife.BindView;
import butterknife.ButterKnife;
import model.HomeAdapter;
import presenter.userpresenter;
import view.Iview;

public class MainActivity extends AppCompatActivity implements Iview {
    HomeAdapter adapter;
    @BindView(R.id.activity_main)
    RelativeLayout activityMain;
    @BindView(R.id.mxr)
    XRecyclerView mxr;
    userpresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        presenter = new userpresenter(this);
        presenter.getUrl(Api.URL);
    }

    @Override
    public void getJson(User user) {
        mxr.setLayoutManager(new LinearLayoutManager(this));
        adapter = new HomeAdapter(user, MainActivity.this);
        mxr.setAdapter(adapter);
        adapter.setOnItemClickLitener(new HomeAdapter.OnItemClickLitener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(MainActivity.this, "点击", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(MainActivity.this, "长恩", Toast.LENGTH_SHORT).show();
            }
        });
    }
} 


也可以自己加上下拉刷新上拉加载的功能,就是一个方法的事...

 mxr.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
            }

            @Override
            public void onLoadMore() {
            }
        });


好了,到这里就完成了,你就可以运行试试了。

谢谢~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值