//加依赖
compile 'io.reactivex:rxandroid:1.1.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 'com.google.code.gson:gson:2.8.1'
compile 'com.android.support:recyclerview-v7:26.+'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.okio:okio:1.13.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.facebook.fresco:fresco:0.12.0'
//加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
public interface IView {
void showList(List<MyBean.DataBean> list);
void showError(String e);
}
public class Api {
//http://mnews.gw.com.cn/wap/data/news/txs/page_1.json
public static final String PATH = "http://mnews.gw.com.cn/";
}
public interface ApiService {
@GET("wap/data/news/txs/page_{pages}.json")
Observable<List<MyBean>> getdatas(@Path("pages")int pages) ;
}
public interface OnRequestListener {
void OnSuccess(List<MyBean.DataBean> list);
void OnError(String e);
}
public interface IModel {
void RequestData(String url,int page,OnRequestListener onRequestListener);
}
public class ListModel implements IModel {
@Override
public void RequestData(String url,int page, final OnRequestListener onRequestListener) {
//retrofit网络请求
Retrofit retrofit=new Retrofit
.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
//结合rxjava
Observable<List<MyBean>> getdatas = apiService.getdatas(page);
getdatas.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<MyBean>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
onRequestListener.OnError(e.getMessage().toString());
}
@Override
public void onNext(List<MyBean> myBeen) {
List<MyBean.DataBean> data = myBeen.get(0).data;
onRequestListener.OnSuccess(data);
}
});
}
}
public interface IPresenter {
void loadList(String url,int page);
}
public class ListPresenter implements IPresenter {
private IView iView;
private IModel iModel;
public ListPresenter(IView iView) {
this.iView = iView;
iModel = new ListModel();
}
//model层与view层交互
@Override
public void loadList(String url,int page) {
iModel.RequestData(url,page, new OnRequestListener() {
@Override
public void OnSuccess(List<MyBean.DataBean> list) {
iView.showList(list);
}
@Override
public void OnError(String e) {
iView.showError(e);
}
});
}
}
public class MyBean {
public HeaderBean header;
public List<DataBean> data;
public static MyBean objectFromData(String str) {
return new Gson().fromJson(str, MyBean.class);
}
public static class HeaderBean {
public int pagesize;
public String last;
public String pre;
public String next;
public int totalsize;
public String first;
public int totalpage;
public static HeaderBean objectFromData(String str) {
return new Gson().fromJson(str, HeaderBean.class);
}
}
public static class DataBean {
public String summary;
public String img;
public String advTypeShare;
public String url;
public int countid;
public String id;
public String title;
public String otime;
public String source;
public String views;
public String resType;
public static DataBean objectFromData(String str) {
return new Gson().fromJson(str, DataBean.class);
}
}
}
在清单列表注册
android:name=".App"
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private Context context;
private List<MyBean.DataBean> list;
public MyAdapter(Context context, List<MyBean.DataBean> list) {
this.context = context;
this.list = list;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
holder.img.setImageURI(list.get(position).img);
holder.tv.setText(list.get(position).title);
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public SimpleDraweeView img;
public TextView tv;
public ViewHolder(View itemView) {
super(itemView);
img=itemView.findViewById(R.id.item_img);
tv=itemView.findViewById(R.id.tv);
}
}
}
public class MainActivity extends AppCompatActivity implements IView{
private RecyclerView recycler;
private MyAdapter myAdapter;
private int p=1;
private SwipeRefreshLayout swif;
private ListPresenter listPresenter;
private LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycler = (RecyclerView) findViewById(R.id.recycler);
swif = (SwipeRefreshLayout) findViewById(R.id.swif);
linearLayoutManager = new LinearLayoutManager(MainActivity.this);
recycler.setLayoutManager(linearLayoutManager);
listPresenter = new ListPresenter(this);
listPresenter.loadList(Api.PATH,p);
}
@Override
public void showList(final List<MyBean.DataBean> list) {
//设置recyclerview展示
myAdapter = new MyAdapter(MainActivity.this, list);
recycler.setAdapter(myAdapter);
recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
if (lastVisibleItemPosition == list.size() - 1) {
p++;
listPresenter.loadList(Api.PATH,p);
}
}
});
swif.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
p++;
listPresenter.loadList(Api.PATH,p);
swif.setRefreshing(false);
}
});
}
@Override
public void showError(String e) {
Toast.makeText(this, "" + e, Toast.LENGTH_SHORT).show();
Log.e("哈哈哈哈啊哈哈哈哈", e);
}
}
//主页面布局
<android.support.v4.widget.SwipeRefreshLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/swif">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler"></android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
//Adapter布局
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/item_img"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_margin="8dp"
fresco:failureImage="@mipmap/ic_launcher" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv"
android:text="dfdf"
android:gravity="center"/>