先 添加依赖
//加载 图片用的包 implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' //Gson implementation 'com.google.code.gson:gson:2.6.2' //xRecyclerView的依赖 implementation 'com.jcodecraeer:xrecyclerview:1.5.9' // OkHttp implementation 'com.squareup.okhttp3:okhttp:3.9.0' //拦截器 implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
设置 权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
android:name=".app.MyApp"
主布局
<?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.day20180627.MainActivity" android:orientation="vertical" > <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/main_rv" android:layout_width="match_parent" android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView> </LinearLayout>
子布局1
<?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="wrap_content"> <TextView android:id="@+id/item_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/item_img" android:layout_toStartOf="@+id/item_img" android:text="title" android:textSize="17sp" /> <ImageView android:id="@+id/item_img" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/item_tvv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/item_img" android:layout_marginEnd="11dp" android:layout_marginRight="11dp" android:layout_toLeftOf="@+id/item_img" android:layout_toStartOf="@+id/item_img" android:text="views" /> </RelativeLayout>
子布局2
<?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="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:text="title" android:textSize="17dp" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imageView" android:layout_width="150dp" android:layout_height="100dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/title" android:layout_marginTop="31dp" /> <ImageView android:id="@+id/imageView2" android:layout_width="150dp" android:layout_height="100dp" android:layout_alignTop="@+id/imageView" android:layout_centerHorizontal="true" /> <ImageView android:id="@+id/imageView3" android:layout_width="150dp" android:layout_height="100dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_alignTop="@+id/imageView2" /> <TextView android:id="@+id/pinglun" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_marginEnd="23dp" android:layout_marginTop="23dp" android:layout_marginRight="23dp" android:text="评论" android:layout_below="@+id/imageView3" /> </RelativeLayout>
写baseActivity Basepresenter IView 自己写
model层
public class MainModel { private static final String TAG = "MainModel"; public void getNews(Integer page, final IMainModelCallback iMainModelCallback){ OkHttpUtils oKhttpUtils = OkHttpUtils.getInstance(); oKhttpUtils.doGet(HttpConfig.MAIN_SHUJU+"?page="+page, new OkHttpUtils.OkCallback() { @Override public void getFailure(Exception e) { if (iMainModelCallback!=null) { iMainModelCallback.getFaild("有错误"); } } @Override public void getResponse(String json) { MainBean mainBean = new Gson().fromJson(json, MainBean.class); Log.d(TAG, "kkkkkkkkkkk: "+"json"); int code = mainBean.getCode(); Log.d(TAG, "-------------: "+code); if(0==code){ if (iMainModelCallback!=null) { iMainModelCallback.getSuccess(mainBean); } }else{ if (iMainModelCallback!=null) { iMainModelCallback.getFaild("请求数据失败"); } } } }); } public interface IMainModelCallback{ void getSuccess(MainBean newsBean); void getFaild(String e); } }
presenter层
public class Mainpresenter extends BasePresenter<MainView> { private MainModel mainModel; public Mainpresenter(MainView view) { super(view); } @Override protected void initModel() { mainModel= new MainModel(); } public void getNews(Integer page){ mainModel.getNews(page, new MainModel.IMainModelCallback() { @Override public void getSuccess(MainBean newsBean) { if(view!=null){ view.onSuccess(newsBean); } } @Override public void getFaild(String e) { if(view!=null){ view.onFaild("有误"); } } }); } }
view 层
public interface MainView extends IView{ void onSuccess(MainBean loginBean); void onFaild(String error); }
OkHttpUtils
public class OkHttpUtils { private static OkHttpUtils okHttpUtils; private final Handler mhandler; private OkHttpClient client ; private OkHttpUtils(){ //日志拦截器 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); mhandler = new Handler(Looper.getMainLooper()); client = new OkHttpClient.Builder() /*.connectTimeout(5000, TimeUnit.MILLISECONDS) .writeTimeout(5000, TimeUnit.MILLISECONDS) .readTimeout(5000, TimeUnit.MILLISECONDS)*/ .addInterceptor(httpLoggingInterceptor) .build(); } public static OkHttpUtils getInstance(){ if (okHttpUtils==null){ synchronized (OkHttpUtils.class){ if (okHttpUtils==null){ return okHttpUtils=new OkHttpUtils(); } } } return okHttpUtils; } public void doGet(String url, final OkCallback okCallback) { Request request = new Request.Builder() .get() .url(url) .build(); final Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (okCallback != null) { //切换到主线程 mhandler.post(new Runnable() { @Override public void run() { okCallback.getFailure(e); } }); } } @Override public void onResponse(Call call, final Response response) throws IOException { try { if (response != null && response.isSuccessful()) { final String json = response.body().string(); mhandler.post(new Runnable() { @Override public void run() { if (okCallback != null) { okCallback.getResponse(json); return; } } }); } } catch (IOException e) { e.printStackTrace(); } } }); } public void doPost(String url, Map<String,String> map, final OkCallback okCallback){ FormBody.Builder builder = new FormBody.Builder(); for (String key:map.keySet()) { builder.add(key,map.get(key)); } FormBody formBody = builder.build(); Request request = new Request.Builder() .post(formBody) .url(url) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (okCallback!=null){ mhandler.post(new Runnable() { @Override public void run() { okCallback.getFailure(e); } }); } } @Override public void onResponse(Call call, final Response response) throws IOException { mhandler.post(new Runnable() { @Override public void run() { try { if (response!=null && response.isSuccessful()){ String s = response.body().string(); if (okCallback!=null){ okCallback.getResponse(s); return; } } }catch (Exception e){ e.printStackTrace(); } if (okCallback!=null){ okCallback.getFailure(new Exception("网络异常")); } } }); } }); } public interface OkCallback{ void getFailure(Exception e); void getResponse(String josn); } }
适配器
public class MyAdapter extends RecyclerView.Adapter { private List<MainBean.DataBeanX.DataBean> list; private int viewType01=0; private static final String TAG = "MyAdapter"; private int viewType02=1; public MyAdapter(List<MainBean.DataBeanX.DataBean> list) { this.list = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main,parent, false); View view2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1_main, parent, false); if(viewType==viewType01){ return new ViewHodler01(view1); }else{ return new ViewHolder02(view2); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int itemViewType = getItemViewType(position); switch (itemViewType){ case 0: Log.d(TAG, "++++++++ "+list.get(position).getTitle()); ((ViewHodler01)holder).textView01.setText(list.get(position).getTitle()+""); //((ViewHodler01)holder).textView02.setText(list.get(position).getTitle()); String url="http://365jia.cn/uploads/"+list.get(position).getPics().get(0); ImageLoader.getInstance().displayImage(url,((ViewHodler01) holder).imageView, MyApp.getOptions()); break; case 1: ((ViewHolder02)holder).textView01.setText(list.get(position).getTitle()); ((ViewHolder02)holder).textView02.setText(list.get(position).getComment_amount()+""); String url0="http://365jia.cn/uploads/"+list.get(position).getPics().get(0); String url1="http://365jia.cn/uploads/"+list.get(position).getPics().get(1); String url2="http://365jia.cn/uploads/"+list.get(position).getPics().get(2); ImageLoader.getInstance().displayImage(url0,((ViewHolder02) holder).imageView,MyApp.getOptions()); ImageLoader.getInstance().displayImage(url1,((ViewHolder02) holder).imageView2,MyApp.getOptions()); ImageLoader.getInstance().displayImage(url2,((ViewHolder02) holder).imageView3,MyApp.getOptions()); break; } } @Override public int getItemCount() { return list==null ? 0 :list.size(); } public class ViewHodler01 extends RecyclerView.ViewHolder{ private TextView textView01,textView02; private ImageView imageView; public ViewHodler01(View itemView) { super(itemView); textView01= itemView.findViewById(R.id.item_tv); textView02= itemView.findViewById(R.id.item_tvv); imageView= itemView.findViewById(R.id.item_img); } } public class ViewHolder02 extends XRecyclerView.ViewHolder{ private TextView textView01,textView02; private ImageView imageView,imageView2,imageView3; public ViewHolder02(View itemView) { super(itemView); textView01= itemView.findViewById(R.id.title); textView02= itemView.findViewById(R.id.pinglun); imageView=itemView.findViewById(R.id.imageView); imageView2=itemView.findViewById(R.id.imageView2); imageView3=itemView.findViewById(R.id.imageView3); } } public int getItemViewType(int position){ List<String> pics = list.get(position).getPics(); if(pics.size()<3){ return viewType01; } return viewType02; } }
主Activity
public class MainActivity extends BaseActivity<Mainpresenter> implements View.OnClickListener,MainView { private static final String TAG = "MainActivity"; private MyAdapter myAdapter; private List<MainBean.DataBeanX.DataBean> list=new ArrayList<>(); private XRecyclerView xRecyclerView; boolean flag = true; int type = 2; android.os.Handler handler = new android.os.Handler(); @Override public void onClick(View v) { } @Override public Context context() { return this; } @Override public void onSuccess(MainBean loginBean) { Toast.makeText(MainActivity.this,"666",Toast.LENGTH_LONG).show(); List<MainBean.DataBeanX.DataBean> data = loginBean.getData().getData(); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); list.addAll(data); //设置适配器 myAdapter= new MyAdapter(list); xRecyclerView.setLayoutManager(linearLayoutManager); xRecyclerView.setAdapter(myAdapter); //下拉刷新 上拉加载 xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { handler.post(new Runnable() { @Override public void run() { flag=true; type++; initDatas(); myAdapter.notifyDataSetChanged(); xRecyclerView.refreshComplete(); } }); } @Override public void onLoadMore() { handler.post(new Runnable() { @Override public void run() { flag=false; type++; initDatas(); myAdapter.notifyDataSetChanged(); xRecyclerView.refreshComplete(); } }); } }); xRecyclerView.refreshComplete(); } @Override public void onFaild(String error) { } @Override protected Mainpresenter providePresenter() { return new Mainpresenter(this); } @Override protected int provideLayoutId() { return R.layout.activity_main; } @Override protected void initDatas() { presenter.getNews(1); } @Override protected void initListener() { } @Override protected void initViews() {//设计 xRecyclerView= (XRecyclerView) findViewById(R.id.main_rv); }
//调用解决内存泄漏的方法 @Override protected void onDestroy() { super.onDestroy(); } }