主流mwp框架+OKHttp網路請求xRecycleView展示
阿新 • • 發佈:2018-12-27
MainActivity
package com.zjh.administrat.recyclerviewdemo3.view; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import android.widget.Toast; import com.jcodecraeer.xrecyclerview.XRecyclerView; import com.zjh.administrat.recyclerviewdemo3.R; import com.zjh.administrat.recyclerviewdemo3.adapter.NewsAdapter; import com.zjh.administrat.recyclerviewdemo3.bean.NewsBean; import com.zjh.administrat.recyclerviewdemo3.presenter.IPresenterImpl; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity implements IView{ private IPresenterImpl iPresenter; private String urlStr = "http://www.xieast.com/api/news/news.php"; private XRecyclerView xRecyclerView; private NewsAdapter mAdapter; private NewsBean newsBean; private int mPage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { xRecyclerView = findViewById(R.id.xRecyclerView); iPresenter = new IPresenterImpl(this); //建立介面卡 mAdapter = new NewsAdapter(this); xRecyclerView.setAdapter(mAdapter); mPage = 1; //佈局管理器 LinearLayoutManager layoutManager=new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); xRecyclerView.setLayoutManager(layoutManager); //重新整理 //載入 xRecyclerView.setPullRefreshEnabled(true); xRecyclerView.setLoadingMoreEnabled(true); xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { mPage = 1; initData(); } @Override public void onLoadMore() { initData(); } }); initData(); } private void initData() { Map<String, String> map = new HashMap<>(); map.put("mPage", "1"); iPresenter.prequestData(urlStr, map, NewsBean.class); } //回來資料的方法 @Override public void viewData(Object data) { newsBean = (NewsBean) data; if (mPage == 1){ mAdapter.setDatas(newsBean.getData()); }else { mAdapter.addDatas(newsBean.getData()); } mPage ++; //停止重新整理,載入 xRecyclerView.refreshComplete(); xRecyclerView.loadMoreComplete(); } @Override protected void onDestroy() { super.onDestroy(); iPresenter.onDetch(); } }
NewsAdapter介面卡
package com.zjh.administrat.recyclerviewdemo3.adapter; import android.content.Context; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.zjh.administrat.recyclerviewdemo3.R; import com.zjh.administrat.recyclerviewdemo3.bean.NewsBean; import java.util.ArrayList; import java.util.List; public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<NewsBean.DataBean> mData; private Context mContext; public NewsAdapter(Context mContext) { this.mContext = mContext; mData = new ArrayList<>(); } public void setDatas(List<NewsBean.DataBean> data) { mData.clear(); if (data != null){ mData.addAll(data); } notifyDataSetChanged(); } public void addDatas(List<NewsBean.DataBean> data) { if (data != null){ mData.addAll(data); } notifyDataSetChanged(); } /** * 分類 */ private static final int TYPE_ONE = 0; private static final int TYPE_TWO = TYPE_ONE + 1; @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { RecyclerView.ViewHolder mHolder = null; if (i == TYPE_ONE) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycle_one, viewGroup, false); mHolder = new ViewHolderOne(view); } else { View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycle_two, viewGroup, false); mHolder = new ViewHolderTwo(view); } return mHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { int type = getItemViewType(i); switch (type) { case TYPE_ONE: ViewHolderOne mHolderOne = (ViewHolderOne) viewHolder; mHolderOne.textView.setText(mData.get(i).getTitle()); Glide.with(mContext).load(mData.get(i).getThumbnail_pic_s()).into(mHolderOne.imageView1); Glide.with(mContext).load(mData.get(i).getThumbnail_pic_s02()).into(mHolderOne.imageView2); Glide.with(mContext).load(mData.get(i).getThumbnail_pic_s03()).into(mHolderOne.imageView3); break; case TYPE_TWO: ViewHolderTwo mHolderTwo = (ViewHolderTwo) viewHolder; mHolderTwo.textView.setText(mData.get(i).getTitle()); Glide.with(mContext).load(mData.get(i).getThumbnail_pic_s()).into(mHolderTwo.imageView); break; default: break; } } @Override public int getItemViewType(int position) { if (mData.get(position).getThumbnail_pic_s02() == null || mData.get(position).getThumbnail_pic_s03() == null){ return TYPE_TWO; }else { return TYPE_ONE; } } @Override public int getItemCount() { return mData.size(); } class ViewHolderOne extends RecyclerView.ViewHolder{ private TextView textView; private ImageView imageView1, imageView2, imageView3; public ViewHolderOne(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); imageView1 = itemView.findViewById(R.id.imageView1); imageView2 = itemView.findViewById(R.id.imageView2); imageView3 = itemView.findViewById(R.id.imageView3); } } class ViewHolderTwo extends RecyclerView.ViewHolder{ private TextView textView; private ImageView imageView; public ViewHolderTwo(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); imageView = itemView.findViewById(R.id.imageView); } } }
OkHttps工具類
package com.zjh.administrat.recyclerviewdemo3.utils; import android.os.Looper; import com.google.gson.Gson; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; public class OkHttps { //簡單post請求 private static volatile OkHttps instance; private OkHttpClient mClient; private android.os.Handler handler = new android.os.Handler(Looper.getMainLooper()); //第一步: 單例 public static OkHttps getInstance(){ if (instance == null){ synchronized (OkHttps.class){ instance = new OkHttps(); } } return instance; } //建立構造方法 public OkHttps() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); mClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .addInterceptor(interceptor) .build(); } public void getRequest(String urlStr, Map<String, String> params, final Class clazz, final ICallBack iCallBack){ FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()){ builder.add(entry.getKey(), entry.getValue()); } FormBody build = builder.build(); Request request = new Request.Builder() .url(urlStr) .post(build) .build(); Call call = mClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { iCallBack.Failed(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); Gson gson = new Gson(); final Object o = gson.fromJson(string, clazz); handler.post(new Runnable() { @Override public void run() { iCallBack.OnSuccess(o); } }); } }); } }
ICallBack介面
package com.zjh.administrat.recyclerviewdemo3.utils;
public interface ICallBack {
void OnSuccess(Object object);
void Failed(Exception e);
}
IPresenter介面
**package com.zjh.administrat.recyclerviewdemo3.presenter;
import java.util.Map;
public interface IPresenter {
void prequestData(String urlStr, Map<String, String> params,Class clazz);
}
**
IPresenterImpl
package com.zjh.administrat.recyclerviewdemo3.presenter;
import android.text.PrecomputedText;
import com.zjh.administrat.recyclerviewdemo3.bean.NewsBean;
import com.zjh.administrat.recyclerviewdemo3.model.IModelImpl;
import com.zjh.administrat.recyclerviewdemo3.utils.MyCallBack;
import com.zjh.administrat.recyclerviewdemo3.view.IView;
import java.util.Map;
public class IPresenterImpl implements IPresenter {
private IView iView;
private IModelImpl iModel;
public IPresenterImpl(IView iView) {
this.iView = iView;
iModel = new IModelImpl();
}
public void onDetch(){
if (iModel != null){
iModel = null;
}
if (iView != null){
iView = null;
}
}
@Override
public void prequestData(String urlStr, Map<String, String> params, Class clazz) {
iModel.mrequestData(urlStr, params, clazz, new MyCallBack() {
@Override
public void OnSuccess(Object data) {
iView.viewData(data);
}
});
}
}
IModel介面
package com.zjh.administrat.recyclerviewdemo3.model;
import com.zjh.administrat.recyclerviewdemo3.utils.MyCallBack;
import java.util.Map;
public interface IModel {
void mrequestData(String urlStr, Map<String, String> params,Class clazz, MyCallBack myCallBack);
}
IModelImpl
package com.zjh.administrat.recyclerviewdemo3.model;
import com.zjh.administrat.recyclerviewdemo3.bean.NewsBean;
import com.zjh.administrat.recyclerviewdemo3.utils.ICallBack;
import com.zjh.administrat.recyclerviewdemo3.utils.MyCallBack;
import com.zjh.administrat.recyclerviewdemo3.utils.OkHttps;
import java.util.Map;
public class IModelImpl implements IModel {
@Override
public void mrequestData(String urlStr, Map<String, String> params, Class clazz, final MyCallBack myCallBack) {
OkHttps.getInstance().getRequest(urlStr, params, clazz, new ICallBack() {
@Override
public void OnSuccess(Object object) {
myCallBack.OnSuccess(object);
}
@Override
public void Failed(Exception e) {
}
});
}
}
需要的依賴
### 如果依賴XrecycleView報錯,可匯入一下程式碼
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '28.0.0'//根據你的底下appcompat-v7版本
}
}
}
}
---------------
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.jcodecraeer:xrecyclerview:1.5.2'
implementation 'com.github.bumptech.glide:glide:4.8.0'