依赖:
implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
MyApp:
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this).build(); ImageLoader.getInstance().init(configuration); } }
HttpUtilsCallback:
public interface HttpUtilsCallback { void onSuccess(String success); void onFail(int errCode, String errMsg); }
NetUtil:
public class NetUtil implements Callback { private static NetUtil netUtil; private final OkHttpClient okHttpClient; private HttpUtilsCallback httpUtilsCallback; private NetUtil() { okHttpClient = new OkHttpClient.Builder().build(); } public static NetUtil getInstance(){ if (netUtil==null){ netUtil=new NetUtil(); } return netUtil; } public void doGet(String url,HttpUtilsCallback httpUtilsCallback){ this.httpUtilsCallback=httpUtilsCallback; Request request = new Request.Builder() .url(url) .build(); Call call = okHttpClient.newCall(request); call.enqueue(this); } public void doPost(String url, HashMap<String,String> map, HttpUtilsCallback httpUtilsCallback){ this.httpUtilsCallback = httpUtilsCallback; FormBody.Builder builder = new FormBody.Builder(); Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()){ String key = iterator.next(); String value = map.get(key); builder.add(key,value); } FormBody body = builder.build(); Request request = new Request.Builder() .url(url) .post(body) .build(); Call call = okHttpClient.newCall(request); call.enqueue(this); } @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { httpUtilsCallback.onSuccess(response.body().string()); } }
JavaBean:
public class JavaBean { /** * error : false * results : [{"_id":"5aa5cc6a421aa9103ed33c7c","createdAt":"2018-03-12T08:40:10.360Z","desc":"3-12","publishedAt":"2018-03-12T08:44:50.326Z","source":"chrome","type":"福利","url":"https://ws1.sinaimg.cn/large/610dc034ly1fp9qm6nv50j20u00miacg.jpg","used":true,"who":"daimajia"},{"_id":"5a8e0c41421aa9133298a259","createdAt":"2018-02-22T08:18:09.547Z","desc":"2-22","publishedAt":"2018-02-22T08:24:35.209Z","source":"chrome","type":"福利","url":"https://ws1.sinaimg.cn/large/610dc034ly1foowtrkpvkj20sg0izdkx.jpg","used":true,"who":"代码家"},{"_id":"5a7b93d2421aa90d2cd3d7f8","createdAt":"2018-02-08T08:03:30.905Z","desc":"2-8","publishedAt":"2018-02-08T08:13:24.479Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20180208080314_FhzuAJ_Screenshot.jpeg","used":true,"who":"daimajia"},{"_id":"5a6e5f88421aa9115696004f","createdAt":"2018-01-29T07:40:56.269Z","desc":"1-29","publishedAt":"2018-01-29T07:53:57.676Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20180129074038_O3ydq4_Screenshot.jpeg","used":true,"who":"daimajia"},{"_id":"5a65381a421aa91156960022","createdAt":"2018-01-22T09:02:18.715Z","desc":"1-22","publishedAt":"2018-01-23T08:46:45.132Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20180122090204_A4hNiG_Screenshot.jpeg","used":true,"who":"daimajia"},{"_id":"5a5bfc29421aa9115489927b","createdAt":"2018-01-15T08:56:09.429Z","desc":"1-15","publishedAt":"2018-01-16T08:40:08.101Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20180115085556_8AeReR_taeyeon_ss_15_1_2018_7_58_51_833.jpeg","used":true,"who":"daimajia"},{"_id":"5a5411fb421aa90fef2035f3","createdAt":"2018-01-09T08:51:07.91Z","desc":"1-9","publishedAt":"2018-01-10T07:57:19.486Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20180109085038_4A7atU_rakukoo_9_1_2018_8_50_25_276.jpeg","used":true,"who":"daimajia"},{"_id":"5a443fcb421aa90fe72536ed","createdAt":"2017-12-28T08:50:19.747Z","desc":"12-28","publishedAt":"2018-01-04T13:45:57.211Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20171228085004_5yEHju_Screenshot.jpeg","used":true,"who":"代码家"},{"_id":"5a4ad432421aa90fe2f02d1a","createdAt":"2018-01-02T08:37:06.235Z","desc":"1-2","publishedAt":"2018-01-02T08:43:32.216Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20180102083655_3t4ytm_Screenshot.jpeg","used":true,"who":"daimajia"},{"_id":"5a431acd421aa90fe50c02a8","createdAt":"2017-12-27T12:00:13.664Z","desc":"12-27","publishedAt":"2017-12-27T12:13:22.418Z","source":"chrome","type":"福利","url":"http://7xi8d6.com1.z0.glb.clouddn.com/20171227115959_lmlLZ3_Screenshot.jpeg","used":true,"who":"daimajia"}] */ private boolean error; private List<ResultsBean> results; public boolean isError() { return error; } public void setError(boolean error) { this.error = error; } public List<ResultsBean> getResults() { return results; } public void setResults(List<ResultsBean> results) { this.results = results; } public static class ResultsBean { /** * _id : 5aa5cc6a421aa9103ed33c7c * createdAt : 2018-03-12T08:40:10.360Z * desc : 3-12 * publishedAt : 2018-03-12T08:44:50.326Z * source : chrome * type : 福利 * url : https://ws1.sinaimg.cn/large/610dc034ly1fp9qm6nv50j20u00miacg.jpg * used : true * who : daimajia */ private String _id; private String createdAt; private String desc; private String publishedAt; private String source; private String type; private String url; private boolean used; private String who; public String get_id() { return _id; } public void set_id(String _id) { this._id = _id; } public String getCreatedAt() { return createdAt; } public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getPublishedAt() { return publishedAt; } public void setPublishedAt(String publishedAt) { this.publishedAt = publishedAt; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public boolean isUsed() { return used; } public void setUsed(boolean used) { this.used = used; } public String getWho() { return who; } public void setWho(String who) { this.who = who; } } }
BasePresenter:
public class BasePresenter<T extends IBaseView> { private T t; public void attachView(T t){ this.t=t; } public T getView() { return t; } }
MainPresenter:
public class MainPresenter extends BasePresenter<IMainView>{ private NetUtil netUtil; public MainPresenter() { netUtil = NetUtil.getInstance(); } public void getDataFromServer(String url) { netUtil.doGet(url, new HttpUtilsCallback() { @Override public void onSuccess(String success) { getView().onSuccess(success); } @Override public void onFail(int errCode, String errMsg) { } }); } }
BaseActivity:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView { private P p; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(setChildContentView()); initView(); p=initPresenter(); p.attachView(this); initData(); } public P getPresenter(){ return p; } abstract void initView(); abstract void initData(); abstract P initPresenter(); abstract int setChildContentView(); }
MainActivity:
public class MainActivity extends BaseActivity<MainPresenter> implements IMainView{ private String url="http://gank.io/api/data/福利/30/1"; private RecyclerView rv; private JavaBean javaBean=new JavaBean(); private MyAdapter adapter; private LinearLayoutManager linearLayoutManager; private GridLayoutManager gridLayoutManager; private StaggeredGridLayoutManager staggeredGridLayoutManager; boolean flag=false; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); adapter.setData(javaBean.getResults()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override void initView() { rv = findViewById(R.id.rv); } @Override void initData() { //设置适配器 adapter = new MyAdapter(MainActivity.this); rv.setAdapter(adapter); //布局管理器 linearLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false); gridLayoutManager = new GridLayoutManager(MainActivity.this,3); staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); //设置布局 rv.setLayoutManager(linearLayoutManager); //请求数据 getPresenter().getDataFromServer(url); } @Override MainPresenter initPresenter() { return new MainPresenter(); } @Override int setChildContentView() { return R.layout.activity_main; } @Override public void onSuccess(String s) { //得到数据,解析数据 Gson gson = new Gson(); javaBean = gson.fromJson(s, JavaBean.class); handler.sendEmptyMessage(0); // Log.e("----MainActivity---","得到数据"+"-----------------"+s); } public void huan(View view) { if (flag){ rv.setLayoutManager(linearLayoutManager); }else { rv.setLayoutManager(gridLayoutManager); } flag=!flag; Log.e("-------",""+flag); } }
MyAdapter:
public class MyAdapter extends RecyclerView.Adapter { private Context context; public MyAdapter(Context context) { this.context = context; } private List<JavaBean.ResultsBean> list=new ArrayList<>(); public void setData(List<JavaBean.ResultsBean> results_list){ list.addAll(results_list); notifyDataSetChanged(); Log.e("----MyAdapter-----","适配器得到数据"+list.get(3).getUrl()); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(context).inflate(R.layout.layout_item, parent ,false); return new MyViewHolder(inflate); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ImageLoader imageLoader = ImageLoader.getInstance(); MyViewHolder viewHolder= (MyViewHolder) holder; DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnFail(R.mipmap.ic_launcher) .showImageOnLoading(R.mipmap.ic_launcher) .showImageForEmptyUri(R.mipmap.ic_launcher) .build(); imageLoader.displayImage(list.get(position).getUrl(),viewHolder.img_item,options); // Log.e("----MyAdapter-----",list.get(position).getUrl()); // viewHolder.text_item.setText(list.get(position).getUrl()); // viewHolder.text_item.setText(list.get(position)); } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private ImageView img_item; // private TextView text_item; public MyViewHolder(View itemView) { super(itemView); img_item = itemView.findViewById(R.id.img_item); // text_item = itemView.findViewById(R.id.text_item); } } }
IBaseView:
public interface IBaseView { }
IMainView:
public interface IMainView extends IBaseView { void onSuccess(String s); }
activity_main.xml:
<?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" android:orientation="vertical" tools:context=".view.activity.MainActivity"> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="huan" android:text="切换"/> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
layout_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/text_item" android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/colorAccent"/> <ImageView android:id="@+id/img_item" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/ic_launcher"/> </LinearLayout>