導入的依賴html
compile 'com.facebook.fresco:fresco:0.14.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.okhttp3:okhttp:3.0.0' compile 'com.squareup.okio:okio:1.5.0' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.jcodecraeer:xrecyclerview:1.3.2' <uses-permission android:name="android.permission.INTERNET"></uses-permission>
activity_item佈局java
<?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="wrap_content" xmlns:fresco="http://schemas.android.com/apk/res-auto">> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="100dp"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/myface" android:layout_width="100dp" android:layout_height="100dp" fresco:actualImageScaleType="focusCrop" fresco:placeholderImageScaleType="fitCenter" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImageScaleType="centerInside" fresco:retryImageScaleType="centerCrop" fresco:fadeDuration="5000" fresco:backgroundImage="@android:color/holo_orange_light" fresco:roundAsCircle="true" > </com.facebook.drawee.view.SimpleDraweeView> <TextView android:id="@+id/mytext" android:layout_width="match_parent" android:layout_height="100dp" android:gravity="center" android:text="世界歡迎你 "/> </LinearLayout> </RelativeLayout>
第一個MainActivityreact
package com.bawie.www.rikao1206; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import com.bawie.www.rikao1206.adapter.MyAdapter; import com.bawie.www.rikao1206.bean.NewsBean; import com.bawie.www.rikao1206.presenter.ShowPresenter; import com.bawie.www.rikao1206.presenter.ShowPresenterImpl; import com.bawie.www.rikao1206.view.ShowView; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.List; public class MainActivity extends AppCompatActivity implements ShowView{ private XRecyclerView xRecyclerView; private List<NewsBean.NewslistBean> list; private LinearLayoutManager manager; private MyAdapter adapter; private ShowPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); xRecyclerView = (XRecyclerView) findViewById(R.id.recycler); manager = new LinearLayoutManager(this); manager.setOrientation(LinearLayoutManager.VERTICAL); xRecyclerView.setLayoutManager(manager); //p關聯v presenter = new ShowPresenterImpl(this); //p關聯m 作網絡請求 presenter.relevance(); xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { adapter.notifyDataSetChanged(); xRecyclerView.refreshComplete();//刷新數據 } @Override public void onLoadMore() { // addData(); // xRecyclerView.loadMoreComplete();//加載數據 } }); } @Override public void showData(NewsBean news) { list = news.getNewslist(); adapter = new MyAdapter(MainActivity.this, list); xRecyclerView.setAdapter(adapter); } /* private void addData() { for (int i = 0; i < 20; i++) { Integer r = Integer.valueOf((int) (Math.random() * 100)); list.add(r, new NewsBean.NewslistBean()); } adapter.notifyDataSetChanged(); }*/ }
MyApp類裏android
package com.bawie.www.rikao1206; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; /** */ public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
utils包裏的RetrofitUtilsapi
package com.bawie.www.rikao1206.utils; import android.util.Log; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by 楊文倩 on 2017/12/6. */ public class RetrofitUtils { private static RetrofitUtils retrofitUtils; private RetrofitUtils() { } public static RetrofitUtils getInstance() { if (retrofitUtils == null) { synchronized (RetrofitUtils.class) { if (retrofitUtils == null) { retrofitUtils = new RetrofitUtils(); } } } return retrofitUtils; } private static Retrofit retrofit; public static synchronized Retrofit getRetrofit(String url) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.i("xxx", message); } }); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(httpLoggingInterceptor) .connectTimeout(500, TimeUnit.SECONDS) .readTimeout(500, TimeUnit.SECONDS) .retryOnConnectionFailure(false) .build(); if (retrofit == null) { retrofit = new Retrofit.Builder().baseUrl(url) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } return retrofit; } public <T> T getApiService(String url, Class<T> cl) { Retrofit retrofit = getRetrofit(url);//獲得retrofit return retrofit.create(cl);//返回的就是網絡接口對象 } }
presenter層定義一個接口ShowPresenter網絡
public interface ShowPresenter { void relevance(); }
presenter層定義一個ShowPresenterImpl類app
package com.bawie.www.rikao1206.presenter; import com.bawie.www.rikao1206.OnFinishListener; import com.bawie.www.rikao1206.bean.NewsBean; import com.bawie.www.rikao1206.model.ShowModel; import com.bawie.www.rikao1206.model.ShowModelImpl; import com.bawie.www.rikao1206.view.ShowView; public class ShowPresenterImpl implements ShowPresenter,OnFinishListener { ShowView showView; private final ShowModel showModel; //初始化 public ShowPresenterImpl(ShowView showView){ this.showView = showView; //多態 showModel = new ShowModelImpl(); } @Override public void relevance() { //p跟m關聯 showModel.getData(this); } @Override public void success(NewsBean news) { showView.showData(news); } }
在Model層定義一個接口ShowModeldom
package com.bawie.www.rikao1206.model; import com.bawie.www.rikao1206.OnFinishListener; /** * Created by 楊文倩 on 2017/12/6. */ public interface ShowModel { void getData(OnFinishListener listener); }
在model層定義一個類ShowModelImplide
package com.bawie.www.rikao1206.model; import com.bawie.www.rikao1206.OnFinishListener; import com.bawie.www.rikao1206.api.Api; import com.bawie.www.rikao1206.api.ApiService; import com.bawie.www.rikao1206.bean.NewsBean; import com.bawie.www.rikao1206.utils.RetrofitUtils; import rx.Observable; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class ShowModelImpl implements ShowModel { @Override public void getData(final OnFinishListener listener) { ApiService apiService = RetrofitUtils.getInstance().getApiService(Api.api_data, ApiService.class); Observable<NewsBean> observable = apiService.getData(); observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<NewsBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(NewsBean bean) { listener.success(bean); } }); } }
在bean包裏定義一個NewsBean佈局
package com.bawie.www.rikao1206.bean; import java.util.List; /** * Created by 楊文倩 on 2017/12/6. */ public class NewsBean { /** * code : 200 * msg : success * newslist : [{"ctime":"2016-12-04 13:00","title":"格林:理解科爾吸食大麻 不過我從沒吸過","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161204/1-161204120131.jpg","url":"http://www.51tyw.com/nba/2421.html"},{"ctime":"2016-12-04 00:00","title":"三分紀錄延續!火箭隊連續19場比賽命中10+三分球","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161203/1-161203233J3.jpg","url":"http://www.51tyw.com/nba/2417.html"},{"ctime":"2016-12-04 00:00","title":"詹姆斯談三連敗:是時候緊起來了 必須打得男人點","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161203/1-161203234010.jpg","url":"http://www.51tyw.com/nba/2418.html"},{"ctime":"2016-12-03 12:00","title":"騎士輸贏都靠三分?那還要詹姆斯作什麼?","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161203/1-161203104344.jpg","url":"http://www.51tyw.com/nba/2407.html"},{"ctime":"2016-12-03 00:00","title":"公牛vs騎士直播看點:詹偉兄弟對決","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-161202221205.jpg","url":"http://www.51tyw.com/nba/2395.html"},{"ctime":"2016-12-02 22:00","title":"火箭和勇士聯手創NBA三分紀錄","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-161202214212.jpg","url":"http://www.51tyw.com/nba/2392.html"},{"ctime":"2016-12-02 22:00","title":"巴克利:勇士打得像女式籃球,太軟了!","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-161202215032.jpg","url":"http://www.51tyw.com/nba/2394.html"},{"ctime":"2016-12-02 20:00","title":"詹姆斯完成月最佳球員4連霸的壯舉!","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-1612021PI0.jpg","url":"http://www.51tyw.com/nba/2388.html"},{"ctime":"2016-12-01 00:00","title":"威少再下三雙戰書!詹皇會不會先認慫?","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161128/1-16112Q13251.jpg","url":"http://www.51tyw.com/nba/2374.html"},{"ctime":"2016-12-01 00:00","title":"騎士這樣的防守想奪冠?也許衛冕只是空談!","description":"NBA新聞","picUrl":"http://www.51tyw.com/uploads/allimg/161130/1-161130222229.jpg","url":"http://www.51tyw.com/nba/2375.html"}] */ private int code; private String msg; private List<NewslistBean> newslist; 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<NewslistBean> getNewslist() { return newslist; } public void setNewslist(List<NewslistBean> newslist) { this.newslist = newslist; } public static class NewslistBean { /** * ctime : 2016-12-04 13:00 * title : 格林:理解科爾吸食大麻 不過我從沒吸過 * description : NBA新聞 * picUrl : http://www.51tyw.com/uploads/allimg/161204/1-161204120131.jpg * url : http://www.51tyw.com/nba/2421.html */ private String ctime; private String title; private String description; private String picUrl; private String url; public String getCtime() { return ctime; } public void setCtime(String ctime) { this.ctime = ctime; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
在api包裏定義一個ApiService接口
package com.bawie.www.rikao1206.api; import com.bawie.www.rikao1206.bean.NewsBean; import retrofit2.http.GET; import rx.Observable; /** * Created by 楊文倩 on 2017/12/6. */ public interface ApiService { @GET("nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10") Observable<NewsBean> getData(); }
在api包裏定義一個Api的類
package com.bawie.www.rikao1206.api; /** * Created by 楊文倩 on 2017/12/6. */ public class Api { //http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10 public static final String api_data ="http://api.tianapi.com/"; }
在adapter包裏定義MyAdapter類
package com.bawie.www.rikao1206.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.bawie.www.rikao1206.R; import com.bawie.www.rikao1206.bean.NewsBean; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.ArrayList; import java.util.List; /** * Created by 楊文倩 on 2017/12/6. */ public class MyAdapter extends XRecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<NewsBean.NewslistBean> list; public MyAdapter(Context context, List<NewsBean.NewslistBean> list) { this.context = context; this.list = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.activity_item, null); ViewHolder holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { // Glide.with(context).load(list.get(position).getGoods_img()).into(holder.imgLogo); holder.txtName.setText(list.get(position).getTitle()); // DraweeController controller = Fresco.newDraweeControllerBuilder() // .setUri(list.get(position).getPicUrl()) // .setAutoPlayAnimations(true) // .build(); // holder.imgLogo.setController(controller); holder.imgLogo.setImageURI(list.get(position).getPicUrl()); } @Override public int getItemCount() { return list.size(); } public void setData(NewsBean bean){ if(this.list == null){ this.list = new ArrayList<>(); } this.list.addAll(bean.getNewslist()); notifyDataSetChanged(); } class ViewHolder extends RecyclerView.ViewHolder{ private SimpleDraweeView imgLogo; private TextView txtName; public ViewHolder(View itemView) { super(itemView); imgLogo = (SimpleDraweeView) itemView.findViewById(R.id.myface); txtName = (TextView) itemView.findViewById(R.id.mytext); } } }
定義一個OnFinishListener接口
package com.bawie.www.rikao1206; import com.bawie.www.rikao1206.bean.NewsBean; /** * Created by 楊文倩 on 2017/12/6. */ public interface OnFinishListener { void success(NewsBean bean); }
view層理ShowView類
package com.bawie.www.rikao1206.view; import com.bawie.www.rikao1206.bean.NewsBean; /** * Created by 楊文倩 on 2017/12/6. */ public interface ShowView { void showData(NewsBean news); }
接口
http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10