今天把这些天常用的知识点总结了一下,写了一篇demon
MVP框架+RXJava+reftorfit请求网络数据+XRecycleView多条目展示(banner轮播+条目展示)、点击事件+fresco图片加载,总体来说,这一套框架还是非常实用的,今天就给大家带来代码的展示:
首先进行一系列的配置,这里边我用到了butterKnife,不会配置的人,可以点击:http://blog.youkuaiyun.com/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() {
}
});
好了,到这里就完成了,你就可以运行试试了。
谢谢~~~