1. 如上图,使用 MVP+xRecyclerView+Retrofit+OkHttp+RxJava
接口:APIKEY=‘71e58b5b2f930eaf1f937407acde08fe’
http://api.tianapi.com/nba/?key=APIKEY&num=10
2. 实现思路:
1. 主页面显示一个xRecycleveiw实现分页加载(10分)
2. Retrofit访问网络接口获取数据(10分)
3. xRecycleview 实现多条目展示上面效果(10分)
4. MVP分层(10分)P调M(5分)V实现P(5分)
5. 自定义搜索框(10分)
6. 在构造方法中初始化Fresco并做配置(10分)
7. 配置图片的显示方式为圆形显示(10分)
8. 在适配器显示视图的方法中通过Fresco来显示图片(10分)
主布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.com.jinjieer.view.MainActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/xre" > </com.jcodecraeer.xrecyclerview.XRecyclerView> </RelativeLayout>
子布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_height="match_parent"> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="10dp" fresco:roundedCornerRadius="20dp" android:id="@+id/sdv" android:layout_gravity="center"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv" android:layout_gravity="center"/> </LinearLayout>
依赖
compile 'io.reactivex:rxjava:1.3.4' compile 'io.reactivex:rxandroid:1.2.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0-beta4' //compile project(':xrecyclerview') compile 'com.facebook.fresco:fresco:0.12.0'//fresco compile 'com.jcodecraeer:xrecyclerview:1.3.2'//xrecyclerview compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>
android:name=".application.MyApplication"
activity
package com.example.com.jinjieer.view; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import android.widget.ProgressBar; import com.example.com.jinjieer.R; import com.example.com.jinjieer.adapter.MyrecyAdapter; import com.example.com.jinjieer.model.Data; import com.example.com.jinjieer.model.DataBean; import com.example.com.jinjieer.presenter.MyDataPresenter; import com.jcodecraeer.xrecyclerview.ProgressStyle; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements DataView{ @BindView(R.id.xre) XRecyclerView xre; private String api = "http://api.tianapi.com/"; private int num=15; private List<Data> list = new ArrayList<>(); private MyrecyAdapter myrecyAdapter; private MyDataPresenter dataPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); init(); dataPresenter = new MyDataPresenter(this); //dataPresenter.toDataUrl(api,10); getBean(); } private void init() { xre.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); xre.setPullRefreshEnabled(true); xre.setLoadingMoreEnabled(true); xre.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader); xre.setLoadingMoreProgressStyle(ProgressStyle.Pacman); xre.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { num = 15; getBean(); getAdapter(); xre.refreshComplete(); } },2000); } @Override public void onLoadMore() { new Handler().postDelayed(new Runnable() { @Override public void run() { num += 10; getBean(); getAdapter(); xre.refreshComplete(); } },2000); } }); } public void getBean(){ dataPresenter.toDataUrl(api,num); } @Override public void getData(Object o) { DataBean<List<Data>> dataBean= (DataBean<List<Data>>) o; Log.d("----", "getData: "+dataBean.getData().size()); List<Data> data = dataBean.getData(); list.clear(); list.addAll(data); getAdapter(); } void getAdapter(){ if(myrecyAdapter == null){ myrecyAdapter = new MyrecyAdapter(MainActivity.this, list); xre.setAdapter(myrecyAdapter); }else{ myrecyAdapter.notifyDataSetChanged(); } }; }
DataView
package com.example.com.jinjieer.view; /** * Created by linmeihui on 2018/4/18. */ public interface DataView { void getData(Object o); }
DataModel
package com.example.com.jinjieer.model; import com.example.com.jinjieer.presenter.DataPresenter; /** * Created by linmeihui on 2018/4/18. */ public interface DataModel { void toDataUrl(String url, int num, DataPresenter presenter); }
MyDataModel
package com.example.com.jinjieer.model; import android.util.Log; import com.example.com.jinjieer.api.APIService; import com.example.com.jinjieer.presenter.DataPresenter; import java.util.List; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by linmeihui on 2018/4/18. */ public class MyDataModel implements DataModel{ @Override public void toDataUrl(String url, int num, final DataPresenter presenter) { Retrofit retrofit=new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); APIService apiService = retrofit.create(APIService.class); apiService.getBeanen("71e58b5b2f930eaf1f937407acde08fe", num) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<DataBean<List<Data>>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { presenter.onFailed(e.getMessage()); } @Override public void onNext(DataBean<List<Data>> dataDataBean) { Log.d("--", "onNext: "+dataDataBean.getData().size()); presenter.onSuccess(dataDataBean); } }); } }
DataPresenter
package com.example.com.jinjieer.presenter; /** * Created by linmeihui on 2018/4/18. */ public interface DataPresenter { void onSuccess(Object o); void onFailed(String e); }
MyDataPresenter
package com.example.com.jinjieer.presenter; import com.example.com.jinjieer.model.DataModel; import com.example.com.jinjieer.model.MyDataModel; import com.example.com.jinjieer.view.DataView; /** * Created by linmeihui on 2018/4/18. */ public class MyDataPresenter implements DataPresenter { private DataView dataview; private DataModel dataModel; public MyDataPresenter(DataView dataView) { this.dataview=dataView; dataModel=new MyDataModel(); } @Override public void onSuccess(Object o) { dataview.getData(o); } @Override public void onFailed(String e) { } public void toDataUrl(String url,int num){ dataModel.toDataUrl(url,num,this); } }
ApiService
package com.example.com.jinjieer.api; import com.example.com.jinjieer.model.Data; import com.example.com.jinjieer.model.DataBean; import java.util.List; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; /** * Created by linmeihui on 2018/4/18. */ public interface APIService { @GET("nba/") Observable<DataBean<List<Data>>> getBeanen(@Query("key") String key, @Query("num") int num); }DataBean
package com.example.com.jinjieer.model; import java.util.List; /** * Created by linmeihui on 2018/4/18. */ public class DataBean <T>{ private int code; private String msg; private T newslist; //List<D> 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 T getData() { return newslist; } public void setData(T newslist) { this.newslist = newslist; } }
Data
package com.example.com.jinjieer.model; /** * Created by linmeihui on 2018/4/18. */ public class Data { /** * 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; } }
Application
package com.example.com.jinjieer.application; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; /** * Created by linmeihui on 2018/4/19. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
MyAdapter
package com.example.com.jinjieer.adapter; import android.content.Context; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.com.jinjieer.R; import com.example.com.jinjieer.model.Data; import com.facebook.drawee.view.SimpleDraweeView; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.List; /** * Created by linmeihui on 2018/4/19. */ public class MyrecyAdapter extends XRecyclerView.Adapter { private Context context; private List<Data> list; public MyrecyAdapter(Context context, List<Data> list) { this.context = context; this.list = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context,R.layout.item,null); ViewHolder viewHolder=new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ViewHolder viewHolder= (ViewHolder) holder; viewHolder.sdv.setImageURI(Uri.parse(list.get(position).getPicUrl())); viewHolder.tv.setText(list.get(position).getTitle()); } @Override public int getItemCount() { return list.size(); } class ViewHolder extends XRecyclerView.ViewHolder{ private final SimpleDraweeView sdv; private final TextView tv; public ViewHolder(View itemView) { super(itemView); sdv = itemView.findViewById(R.id.sdv); tv = itemView.findViewById(R.id.tv); } } }