1.先看看效果,本人比较懒,效果很简单,主要看代码
2.导入依赖和权限(根据自己需求)
注:红色波浪线不是报错
//bufferknife注解 compile 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' // recyclerview的依赖 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' //图片无限轮播 compile 'com.youth.banner:banner:1.4.9' //图片加载依赖 compile 'org.webjars.npm:react-imageloader:2.1.0' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.github.bumptech.glide:glide:3.7.0' // Retrofit库 compile 'com.squareup.retrofit2:retrofit:2.0.1' // rxjava+rxandroid+retrofit2+okhttp compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' //gson解析数据 compile 'com.google.code.gson:gson:2.6.2'
权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3.搭建项目结构
注:项目结构一定要清晰
4.创建bean(自己写)
5.写M、V、P接口
/** * Created by Administrator on 2018/4/19. */ //定义M层接口 public interface InRecModel { //创建getData void getData(HomeSet homeSet); public interface HomeSet { void doSet(RecBean recBean); } }
View
public interface InRecView { void setData(RecBean recBean); }
6.p层类
public class RecPresenter { /* *将V层与P层绑定 * 将M层与P层绑定 */ private InRecView inRecView; private InRecModel inRecModel; public RecPresenter(InRecView inRecView) { this.inRecView = inRecView; this.inRecModel = new RecModel(); } //将数据回调给视图 public void HomeData(){ inRecModel.getData(new InRecModel.HomeSet() { @Override public void doSet(RecBean recBean) { inRecView.setData(recBean); } }); } //解绑,将inRecView赋空并在MainActivity中回调此方法。 public void onDestory(){ if (inRecView != null){ inRecView = null; } } }
7.Api
public class Api { //指定接口路径 public static final String HOST = "http://result.eolinker.com/"; public static final String HOSTURL = "umIPmfS6c83237d9c70c7c9510c9b0f97171a308d13b611?"; }
8.ApiServer
** * Created by Administrator on 2018/4/19. */ public interface ApiServer { //拼接接口参数 String APIKEY = Api.HOSTURL; @GET(APIKEY+"uri=homepage") //使用Observable,并给他一个泛型类型根据自己需求 Observable<RecBean> getHome(); }
9.封装Retrofit
9.1LoggHttp
//实现Interceptor接口 public class LoggHttp implements Interceptor{ //定义系统的引擎(操作系统及版本、CPU 类型、浏览器及版本、 // 浏览器渲染引擎、浏览器语言、浏览器插件等) private static final String UA = "User-Agent"; @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request() .newBuilder() .addHeader(UA, makeUA()) .build(); return chain.proceed(request); } //使用网络拦截器 private String makeUA() { String s = Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE; return Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE; } }
9.2
RetroFcunt
public class RetroFcunt { public static ApiServer build(String path){ //创建OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new LoggHttp()).connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30,TimeUnit.SECONDS) .build(); //创建Retrofit ApiServer builder = new Retrofit.Builder() .baseUrl(path) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(client) .build() .create(ApiServer.class); return builder; } }
9.3.model类
public class RecModel implements InRecModel{ @Override public void getData(final HomeSet homeSet) { //将封装好的RetroFcunt拿出来.build,指定他的接口,,并调用M层接口里的getHome方法。 Observable<RecBean> home = RetroFcunt.build(Api.HOST).getHome(); //subscribeOn调回子线程 home.subscribeOn(Schedulers.io()) //调回主线程 .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<RecBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Log.i("8888888",e.getMessage()); } @Override public void onNext(RecBean recBean) { //将数据回调到P层 homeSet.doSet(recBean); Log.i("8888888",recBean.toString()); } }); } }
10.MainActivity
public class MainActivity extends AppCompatActivity implements InRecView{ private static final String TAG = MainActivity.ACCESSIBILITY_SERVICE; @BindView(R.id.rec) RecyclerView rec; private RecPresenter p; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //黄油刀 ButterKnife.bind(this); //实例P层,调用HomeData()。 p = new RecPresenter(this); p.HomeData(); } @Override public void setData(RecBean recBean) { //new一个RecycleView适配器 RecAdapter recAdapter = new RecAdapter(recBean.getData(),this); Log.i(TAG,"++++++++++++"+recAdapter.toString()); Log.i("777777777",recBean.toString()); //创建RecycleView布局,并赋值 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); rec.setLayoutManager(linearLayoutManager); //给适配器赋值 rec.setAdapter(recAdapter); } //M、V、P解绑 @Override protected void onDestroy() { super.onDestroy(); p.onDestory(); } }
11.适配器
public class RecAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private RecBean.DataBean data; private MainActivity mainActivity; //定义两个int值 private int TYPE_1=0; private int TYPE_2=1; public RecAdapter(RecBean.DataBean data, MainActivity mainActivity) { this.data = data; this.mainActivity = mainActivity; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType){ case 0://如果是0的话,第一条目将是轮播图 View inflate = LayoutInflater.from(mainActivity).inflate(R.layout.layout_banner, parent, false); HolderView holderView = new HolderView(inflate); return holderView;//返回HolderView对象 case 1://如果是1的话,第二条目将是内容 View inflate1 = LayoutInflater.from(mainActivity).inflate(R.layout.layout_itme, parent, false); HolderView1 holderView1 = new HolderView1(inflate1); return holderView1; } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //做个判断,如果是HolderView给banner赋图片路径 if (holder instanceof HolderView){ HolderView holderView = (HolderView)holder; List<String> bannerlist = new ArrayList<>(); for (int i = 0; i<data.getAd1().size();i++){ bannerlist.add(data.getAd1().get(position).getImage()); } holderView.myBanner.setImageLoader(new ImageLoader() { @Override public void displayImage(Context context, Object path, ImageView imageView) { Glide.with(context).load(path).into(imageView); } }); holderView.myBanner.setImages(bannerlist); holderView.myBanner.setDelayTime(3000); holderView.myBanner.setBannerAnimation(Transformer.DepthPage).isAutoPlay(true); holderView.myBanner.start(); //否则,如果是HolderView1给TextView赋值 }else if(holder instanceof HolderView1){ ((HolderView1) holder).tv2.setText(data.getAd5().get(position).getTitle()); ((HolderView1) holder).tv3.setText(data.getAd8().get(position).getTitle()); } } @Override public int getItemCount() { return 2; } @Override public int getItemViewType(int position) { if(position==0){ return TYPE_1; }else if (position==1){ return TYPE_2; }else { return -1; } } public class HolderView extends RecyclerView.ViewHolder{ private final Banner myBanner; // @BindView(R.id.myBanner) // Banner myBanner; public HolderView(View itemView) { super(itemView); // ButterKnife.bind(mainActivity,itemView); myBanner = itemView.findViewById(R.id.myBanner); } } public class HolderView1 extends RecyclerView.ViewHolder{ private final TextView tv2; private final TextView tv3; // @BindView(R.id.tv2) // TextView tv2; // @BindView(R.id.tv3) // TextView tv3; public HolderView1(View itemView) { super(itemView); // ButterKnife.bind(mainActivity,itemView); tv2 = itemView.findViewById(R.id.tv2); tv3 = itemView.findViewById(R.id.tv3); } } }
12.activity_main.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"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="50dp" android:hint="搜索" android:background="@drawable/layout_shape"/> <android.support.v7.widget.RecyclerView android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/rec"/> </LinearLayout> </LinearLayout>
13.layout_banner.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="100dp"> <com.youth.banner.Banner android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/myBanner"/> </LinearLayout>
14.layout_itme.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="30dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="haha" android:id="@+id/tv1"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="aaaa" android:id="@+id/tv2"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ssss" android:id="@+id/tv3"/> </LinearLayout> </LinearLayout>