//依赖
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 'com.squareup.okhttp3:okhttp:3.9.0' 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.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" />
//别忘了初始Fresco
android:name=".MyApplication"
package com.example.refresh.view; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import com.example.refresh.R; import com.example.refresh.adapter.MyAdapter; import com.example.refresh.bean.ShowBean; import com.example.refresh.presenter.NewsPresenter; 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 { @BindView(R.id.xrv) XRecyclerView mXrv; private NewsPresenter presenter; private List<ShowBean.NewslistBean> list = new ArrayList<>(); private MyAdapter adapter; private int num=10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2); gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); mXrv.setLayoutManager(gridLayoutManager); getData(num); mXrv.setPullRefreshEnabled(true); mXrv.setLoadingMoreEnabled(true); mXrv.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader); //样式可有可无 mXrv.setLoadingMoreProgressStyle(ProgressStyle.Pacman); //样式可有可无 mXrv.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable(){ public void run() { num=10; getData(num); mXrv.refreshComplete(); } }, 2000); } @Override public void onLoadMore() { new Handler().postDelayed(new Runnable(){ public void run() { num+=10; getData(num); mXrv.refreshComplete(); } }, 2000); } }); } public void getData(int count){ presenter = new NewsPresenter(); presenter.getNews("2a0024d1f7f558e09936f697580f1643", num); presenter.attachView(new NewsView() { @Override public void success(List<ShowBean.NewslistBean> data) { //list.clear(); list.addAll(data); Log.i("zzz", "success: " + list.toString()); if (adapter==null){ adapter = new MyAdapter(list, MainActivity.this); mXrv.setAdapter(adapter); }else { adapter.notifyDataSetChanged(); } } @Override public void failed(String e) { } }); } @Override protected void onDestroy() { super.onDestroy(); if (presenter !=null){ presenter.detachView(); } } }
//适配器
package com.example.refresh.adapter; import android.content.Context; import android.content.Intent; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.example.refresh.R; import com.example.refresh.bean.ShowBean; import com.example.refresh.view.Main2Activity; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; /** * Created by 知足 on 2018/2/5. */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<ShowBean.NewslistBean> datas; private Context context; public MyAdapter(List<ShowBean.NewslistBean> datas, Context context) { this.datas = datas; this.context = context; } //创建新View,被LayoutManager所调用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = View.inflate(context, R.layout.item, null); ViewHolder vh = new ViewHolder(view); return vh; } //将数据与界面进行绑定的操作 @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { viewHolder.item_img.setImageURI(datas.get(position).getPicUrl()); viewHolder.mTextView.setText(datas.get(position).getTitle()); viewHolder.item_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(context, Main2Activity.class); intent.putExtra("key",datas.get(position).getPicUrl()); context.startActivity(intent); } }); } //获取数据的数量 @Override public int getItemCount() { return datas.size(); } //自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; private SimpleDraweeView item_img; public ViewHolder(View view) { super(view); mTextView = (TextView) view.findViewById(R.id.text); item_img = view.findViewById(R.id.item_img); } } }
Http
package com.example.refresh.http; import com.example.refresh.bean.ShowBean; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; /** * Created by 知足 on 2018/2/5. */ public interface LogService { // http://api.tianapi.com/meinv/?key=2a0024d1f7f558e09936f697580f1643&num=2000 @GET("meinv/") Observable<ShowBean> getUrl(@Query("key") String key, @Query("num") int num); }
model
package com.example.refresh.model; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by 知足 on 2018/2/5. */ public class RetrofitUtils { private static volatile RetrofitUtils instance; private Retrofit retrofit; private RetrofitUtils(){ } private RetrofitUtils(String baseUrl){ OkHttpClient client = new OkHttpClient(); retrofit = new Retrofit.Builder() .client(client) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(baseUrl) .build(); } public static RetrofitUtils getInstance(String baseUrl){ if (instance==null){ synchronized (RetrofitUtils.class){ if (null==instance){ instance = new RetrofitUtils(baseUrl); } } } return instance; } public static RetrofitUtils getInstance(){ if (null == instance){ return getInstance("http://api.tianapi.com/"); } return instance; } public Retrofit getRetrofit(){ return retrofit; } }
presenter
package com.example.refresh.presenter; import com.example.refresh.bean.ShowBean; import com.example.refresh.http.LogService; import com.example.refresh.model.RetrofitUtils; import com.example.refresh.view.NewsView; import java.util.List; import retrofit2.Retrofit; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * Created by 知足 on 2018/2/5. */ public class NewsPresenter { private NewsView inv; private Subscription subscribe; public void attachView(NewsView inv){ this.inv = inv; } public void getNews(String key,int num){ Retrofit retrofit = RetrofitUtils.getInstance().getRetrofit(); LogService service = retrofit.create(LogService.class); subscribe = service.getUrl(key,num) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<ShowBean>() { @Override public void call(ShowBean jsonBean) { List<ShowBean.NewslistBean> list = jsonBean.getNewslist(); inv.success(list); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { inv.failed(throwable.getMessage()); } }); } public void detachView(){ // 当Activity销毁的时候取消订阅时间,防止内存泄漏 if (subscribe != null) { if (subscribe.isUnsubscribed()) { subscribe.unsubscribe(); } } if (inv!=null){ inv = null; } } }
view
package com.example.refresh.view; import com.example.refresh.bean.ShowBean; import java.util.List; /** * Created by 知足 on 2018/2/5. */ public interface NewsView { void success(List<ShowBean.NewslistBean> data); void failed(String e); }
//初始化Fresco
package com.example.refresh; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; /** * Created by 知足 on 2018/2/5. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
package com.example.refresh.view; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import com.example.refresh.R; import com.facebook.drawee.view.SimpleDraweeView; import retrofit2.http.Url; public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); SimpleDraweeView img = findViewById(R.id.img); Intent intent = getIntent(); String key = intent.getStringExtra("key"); Log.i("xxx",key.toString()); img.setImageURI(Uri.parse(key)); } }
布局文件
activity_main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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.refresh.view.MainActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/xrv" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.jcodecraeer.xrecyclerview.XRecyclerView> </LinearLayout>
activity_main2
<?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.refresh.view.Main2Activity"> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="1000dp" android:layout_height="1000dp" android:id="@+id/img" /> </RelativeLayout>
item
<?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="match_parent" xmlns:fresco="http://schemas.android.com/apk/res-auto"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/item_img" android:layout_width="400dp" android:layout_height="400dp" 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"> </com.facebook.drawee.view.SimpleDraweeView> <!-- <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text" android:text="世界你好" android:layout_below="@id/item_img" android:layout_centerHorizontal="true" />--> <TextView android:layout_below="@id/item_img" android:id="@+id/text" android:layout_width="match_parent" android:layout_height="100dp" android:gravity="center" android:text="世界欢迎你 "/> </RelativeLayout>
bean包自己GsonFormat解析
http://api.tianapi.com/meinv/?key=2a0024d1f7f558e09936f697580f1643&num=2000