OKHttp工具类

在这里插入代码片
package com.bawei.week3.okHttp;

import android.os.Handler;
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.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;

public class OkHttpUtils {
    private static volatile OkHttpUtils mInstance = new OkHttpUtils();
    private OkHttpClient mClient;
    private Handler mHandler = new Handler(Looper.getMainLooper());

    public static OkHttpUtils getInstance() {
        return mInstance;
    }

    private OkHttpUtils() {
        //日志拦截器,可加可不加
        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 postEnqueue(final String url, Map<String, String> params, final Class clazz, final ICallBack callBack) {
        FormBody.Builder builder = new FormBody.Builder();

        for (Map.Entry<String, String> entry : params.entrySet()) {
            builder.add(entry.getKey(), entry.getValue());
        }

        RequestBody body = builder.build();
        Request request = new Request.Builder()
                .post(body)
                .url(url)
                .build();

        Call call = mClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.failed(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response){
                //添加try catch,防止解析崩溃
                try{
                    String result = response.body().string();
                    Gson gson = new Gson();
                    final Object o = gson.fromJson(result, clazz);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callBack.success(o);
                        }
                    });
                }catch (Exception e){
                    callBack.failed(e);
                }
            }
        });
    }
}

Activity页面切换网格布局

package com.bawei.week3.activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bawei.week3.Apis;
import com.bawei.week3.Bean.ProductsListBean;
import com.bawei.week3.Constants;
import com.bawei.week3.R;
import com.bawei.week3.adapter.RecyclerAdapter;
import com.bawei.week3.presenter.IPresenterImpl;
import com.bawei.week3.view.IView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity implements IView, View.OnClickListener {
    private static final int SPAN_COUNT = 2;

    private IPresenterImpl mIPresenterImpl;
    private EditText mEdit;
    private XRecyclerView mXRecyclerView;
    private RecyclerAdapter mAdapter;
    /**
     * 用成员变量记录页数
     */
    private int mPage = 1;
    /**
     * 用成员变量记录所选条目
     */
    private int mSort = 0;
    /**
     * 用来控制管理器是线性还是网格
     */
    private boolean mIsLinear = true;
    private TextView mTvComplex, mTvSalesVolume, mTvPrice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initPresenter();
        initView();
        initRecyclerView();
    }

    /**
     * 实现P层
     */
    private void initPresenter() {
        mIPresenterImpl = new IPresenterImpl(this);
    }

    /**
     * 初始化所有控件
     */
    private void initView() {
        mTvComplex = findViewById(R.id.tv_complex);
        mTvSalesVolume = findViewById(R.id.tv_sales_volume);
        mTvPrice = findViewById(R.id.tv_price);
        mTvComplex.setSelected(true);

        findViewById(R.id.iv_search);
        findViewById(R.id.iv_change);
        mEdit = findViewById(R.id.edit_text);
        mXRecyclerView = findViewById(R.id.XRecyclerView);

        findViewById(R.id.iv_search).setOnClickListener(this);
        findViewById(R.id.iv_change).setOnClickListener(this);
        mTvComplex.setOnClickListener(this);
        mTvSalesVolume.setOnClickListener(this);
        mTvPrice.setOnClickListener(this);
    }

    /**
     * 初始化RecyclerView
     */
    private void initRecyclerView() {
        mXRecyclerView.setPullRefreshEnabled(true);
        mXRecyclerView.setLoadingMoreEnabled(true);
        mXRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                mPage = 1;
                getProductList();
            }

            @Override
            public void onLoadMore() {
                getProductList();
            }
        });

        changeRecyclerView();
    }

    /**
     * 切换管理器
     */
    private void changeRecyclerView() {
        //根据状态判断展示线性还是网格
        if (mIsLinear) {
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            mXRecyclerView.setLayoutManager(layoutManager);
        } else {
            GridLayoutManager layoutManager = new GridLayoutManager(this, SPAN_COUNT);
            layoutManager.setOrientation(GridLayoutManager.VERTICAL);
            mXRecyclerView.setLayoutManager(layoutManager);
        }

        //重新创建adapter,因为new 之后数据和点击事件都没有了,所以需要重新添加点击事件
        mAdapter = new RecyclerAdapter(this, mIsLinear);
        mAdapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                List<ProductsListBean.Data> data = mAdapter.getData();
                Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                intent.putExtra(Constants.INTENT_KEY_PRODUCES_PID, data.get(position).getPid());
                startActivity(intent);
            }
        });
        mXRecyclerView.setAdapter(mAdapter);
        //将状态反选
        mIsLinear = !mIsLinear;
    }

    /**
     * 拉取数据
     */
    private void getProductList() {
        HashMap<String, String> map = new HashMap<>();
        map.put(Constants.MAP_KEY_SEARCH_PRODUCTS_KEYWORDS, mEdit.getText().toString());
        map.put(Constants.MAP_KEY_SEARCH_PRODUCES_PAGE, String.valueOf(mPage));
        map.put(Constants.MAP_KEY_SEARCH_PRODUCES_SORT, String.valueOf(mSort));

        mIPresenterImpl.startRequest(Apis.URL_SEARCH_PRODUCTS, map, ProductsListBean.class);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_search:
                //开始获取网络数据
                getProductList();
                break;
            case R.id.iv_change:
                //切换布局
                //因为切换布局时需要new 一个adapter,为了保证数据的一致性,所以先取出老adapter中的老数据
                List<ProductsListBean.Data> data = mAdapter.getData();
                changeRecyclerView();
                //将老数据赋值给新的adapter
                mAdapter.setData(data);
                break;
            case R.id.tv_complex:
                //如果当前栏目已经被选中,则再次点击无效,不然就会再次请求
                if(!mTvComplex.isSelected()) {
                    //切换时一定要从第一页获取数据,不然会造成新老数据在一起,导致排序出现问题
                    mPage = 1;
                    mSort = 0;
                    getProductList();

                    mTvComplex.setSelected(true);
                    mTvSalesVolume.setSelected(false);
                    mTvPrice.setSelected(false);
                }
                break;
            case R.id.tv_sales_volume:
                if(!mTvSalesVolume.isSelected()) {
                    mPage = 1;
                    mSort = 1;
                    getProductList();

                    mTvComplex.setSelected(false);
                    mTvSalesVolume.setSelected(true);
                    mTvPrice.setSelected(false);
                }
                break;
            case R.id.tv_price:
                if(!mTvPrice.isSelected()) {
                    mPage = 1;
                    mSort = 2;
                    getProductList();

                    mTvComplex.setSelected(false);
                    mTvSalesVolume.setSelected(false);
                    mTvPrice.setSelected(true);
                }
                break;
            default:
                break;
        }
    }


    @Override
    public void showResponseData(Object data) {
        if (data instanceof ProductsListBean) {
            ProductsListBean productsListBean = (ProductsListBean) data;
            List<ProductsListBean.Data> list = productsListBean.getData();
            if (mPage == 1) {
                mAdapter.setData(list);
            } else {
                mAdapter.addData(list);
            }

            mPage++;
            mXRecyclerView.refreshComplete();
            mXRecyclerView.loadMoreComplete();
        }else{
            Toast.makeText(this, "获取数据失败", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void showResponseFail(Object data) {
        if (data instanceof Exception){
            Exception e = (Exception)data;
            e.printStackTrace();
        }
        Toast.makeText(this, "网络请求失败", Toast.LENGTH_SHORT).show();
    }
}

详情页面

package com.bawei.week3.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import com.bawei.week3.Apis;
import com.bawei.week3.Bean.ProductDetailBean;
import com.bawei.week3.Constants;
import com.bawei.week3.R;
import com.bawei.week3.presenter.IPresenterImpl;
import com.bawei.week3.view.IView;

import java.util.HashMap;

public class DetailActivity extends AppCompatActivity implements IView{
    private IPresenterImpl mIPresenterImpl;
    private String mPid;
    private TextView mTvDetail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        getPid();
        initPresenter();
        initView();
        getData();
    }

    private void getPid() {
        mPid = getIntent().getStringExtra(Constants.INTENT_KEY_PRODUCES_PID);
    }

    private void initPresenter() {
        mIPresenterImpl = new IPresenterImpl(this);
    }

    private void initView() {
        mTvDetail = findViewById(R.id.tv_detail);
    }

    private void getData() {
        HashMap<String, String> map = new HashMap<>();
        map.put(Constants.MAP_KEY_PRODUCTS_DETAIL_PID, mPid);

        mIPresenterImpl.startRequest(Apis.URL_PRODUCTS_DETAIL, map, ProductDetailBean.class);
    }

    @Override
    public void showResponseData(Object data) {
        if(data instanceof ProductDetailBean){
            ProductDetailBean productDetailBean = (ProductDetailBean)data;
            Toast.makeText(this, productDetailBean.getCode(), Toast.LENGTH_SHORT).show();
            //TODO:完成详情页剩余布局,完成javaBean剩余参数,完成数据展示,我不写了
        }else{
            Toast.makeText(this, "获取数据失败", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void showResponseFail(Object data) {
        if (data instanceof Exception){
            Exception e = (Exception)data;
            e.printStackTrace();
        }
        Toast.makeText(this, "网络请求失败", Toast.LENGTH_SHORT).show();
    }
}

Adapter 类

package com.bawei.week3.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bawei.week3.Bean.ProductsListBean;
import com.bawei.week3.R;
import com.bumptech.glide.Glide;

import java.util.ArrayList;
import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<ProductsListBean.Data> mList = new ArrayList<>();

    private boolean mIsLinear;

    public RecyclerAdapter(Context context, boolean isLinear) {
        mContext = context;
        mIsLinear = isLinear;
    }

    public List<ProductsListBean.Data> getData(){
        //TODO:完成剩余布局,完成javaBean剩余参数,完成数据展示,我不写了
        return  mList;
    }

    public void setData(List<ProductsListBean.Data> list) {
        if (list != null) {
            mList = list;
        }

        notifyDataSetChanged();
    }

    public void addData(List<ProductsListBean.Data> list) {
        if (list != null) {
            mList.addAll(list);
        }

        notifyDataSetChanged();
    }


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = null;
        if (mIsLinear) {
            View v = View.inflate(mContext, R.layout.item_recycle_linear, null);
            holder = new ViewHolderLinear(v);
        }else{
            View v = View.inflate(mContext, R.layout.item_recycle_grid, null);
            holder = new ViewHolderGrid(v);
        }

        return holder;

    }


    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        String img = mList.get(position).getImages();
        String[] imgs = img.split("\\|");

        if(mIsLinear) {
            ViewHolderLinear holderLinear = (ViewHolderLinear) holder;
            Glide.with(mContext).load(imgs[0]).into(holderLinear.img);
            holderLinear.textView.setText(mList.get(position).getTitle());
            holderLinear.ll_item_recycle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mClickListener != null){
                        mClickListener.onItemClick(position);
                    }
                }
            });
        }else{
            ViewHolderGrid holderGrid = (ViewHolderGrid) holder;
            Glide.with(mContext).load(imgs[0]).into(holderGrid.img);
            holderGrid.textView.setText(mList.get(position).getTitle());
        }
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    class ViewHolderLinear extends RecyclerView.ViewHolder {
        public ImageView img;
        public TextView textView;
        public LinearLayout ll_item_recycle;

        public ViewHolderLinear(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_item_recycle);
            img = itemView.findViewById(R.id.iv_item_recycle);
            ll_item_recycle = itemView.findViewById(R.id.ll_item_recycle);
        }
    }

    class ViewHolderGrid extends RecyclerView.ViewHolder {
        public ImageView img;
        public TextView textView;

        public ViewHolderGrid(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_item_grid);
            img = itemView.findViewById(R.id.iv_item_grid);
        }
    }


    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public interface OnLongItemClickListener {
        void onItemLongClick(int position);
    }

    private OnItemClickListener mClickListener;
    private OnLongItemClickListener mLongItemClickListener;

    public void setOnItemClickListener(OnItemClickListener clickListener) {
        this.mClickListener = clickListener;
    }

    public void setOnLongItemClickListener(OnLongItemClickListener longItemClickListener) {
        this.mLongItemClickListener = longItemClickListener;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值