依赖================================================
apply plugin: 'com.android.application' android { compileSdkVersion 27 defaultConfig { applicationId "com.example.appcode5" minSdkVersion 19 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } //添加部分 configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.support') { if (!requested.name.startsWith("multidex")) { details.useVersion '27.1.1' } } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //noinspection GradleCompatible implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //依赖 implementation 'io.reactivex:rxjava:1.3.4' implementation 'io.reactivex:rxandroid:1.2.1' implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0-beta4' //compile project(':xrecyclerview') implementation 'com.facebook.fresco:fresco:0.12.0'//fresco implementation 'com.jcodecraeer:xrecyclerview:1.3.2'//xrecyclerview implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' }
权限====================================================
<uses-permission android:name="android.permission.INTERNET"/>
android:name=".Modle.Api.MyApplication"
布局=======================================================
<?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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".View.activity.MainActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/xre" > </com.jcodecraeer.xrecyclerview.XRecyclerView> </RelativeLayout>
item===========================================
<?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"> <TextView android:id="@+id/tv" android:layout_width="350dp" android:layout_height="wrap_content" android:layout_gravity="center" /> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sdv" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="10dp" fresco:roundedCornerRadius="20dp" /> </LinearLayout>
ApiService===========================================
package com.example.appcode5.Modle.Api; import com.example.appcode5.Modle.bean.Data; import com.example.appcode5.Modle.bean.DataBean; import java.util.List; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; public interface APIService { @GET("nba/") Observable<DataBean<List<Data>>> getBeanen(@Query("key") String key, @Query("num") int num); }
MyApplicatior========================================
package com.example.appcode5.Modle.Api; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
Data===============================================
package com.example.appcode5.Modle.bean; 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; } }
DataBean===============================================
package com.example.appcode5.Modle.bean; 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; } }
DataModel======================================
package com.example.appcode5.Modle.IModle; import com.example.appcode5.Presenter.MyDataPresenter; public interface DataModel { void toDataUrl(String url, int num, MyDataPresenter presenter); }
MyDataModel=====================================
package com.example.appcode5.Modle.IModle; import android.util.Log; import com.example.appcode5.Modle.Api.APIService; import com.example.appcode5.Modle.bean.Data; import com.example.appcode5.Modle.bean.DataBean; import com.example.appcode5.Presenter.MyDataPresenter; 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; public class MyDataModel implements DataModel{ @Override public void toDataUrl(String url, int num, final MyDataPresenter 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.appcode5.Presenter; public interface DataPresenter { void onSuccess(Object o); void onFailed(String e); }
MyDataPresenter====================================
package com.example.appcode5.Presenter; import com.example.appcode5.Modle.IModle.DataModel; import com.example.appcode5.Modle.IModle.MyDataModel; import com.example.appcode5.View.IView.DataView; 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); } }
MainActivity======================================
package com.example.appcode5.View.activity; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import com.example.appcode5.Modle.bean.Data; import com.example.appcode5.Modle.bean.DataBean; import com.example.appcode5.Presenter.MyDataPresenter; import com.example.appcode5.R; import com.example.appcode5.View.IView.DataView; import com.example.appcode5.View.adapter.MyrecyAdapter; 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(); } }; }
MyrecyAdapter==========================================
package com.example.appcode5.View.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.appcode5.Modle.bean.Data; import com.example.appcode5.R; import com.facebook.drawee.view.SimpleDraweeView; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.List; 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); } } }
DataView========================================
package com.example.appcode5.View.IView; public interface DataView { void getData(Object o); }