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'