1. 程式人生 > >主流mwp框架+OKHttp網路請求xRecycleView展示

主流mwp框架+OKHttp網路請求xRecycleView展示

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'