封装一个OkHttpUtil
public class OkHttpUtil {
private OkHttpListener mOkHttpListener;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0://成功
String data = (String) msg.obj;
mOkHttpListener.OkHttpSuccess(data);
break;
case 1://失败
String error = (String) msg.obj;
mOkHttpListener.OkHttpError(error);
break;
}
}
};
//生成 OkHttpListener set方法
public void setOkHttpListener(OkHttpListener okHttpListener) {
mOkHttpListener = okHttpListener;
}
public OkHttpUtil OkHttpGet(String url){
//获取clench对象
OkHttpClient okHttpClient = new OkHttpClient();
//获取Request对象
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
/**
* 失败回调方法
* @param call
* @param e
*/
@Override
public void onFailure(Call call, IOException e) {
Message message = new Message();
message.what = 1;
message.obj = e.getMessage();
mHandler.sendMessage(message);
}
/**
* 成功回调方法
* @param call
* @param response
* @throws IOException
*/
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = new Message();
message.what = 0;
message.obj = response.body().string();
mHandler.sendMessage(message);
}
});
return this;
}
public OkHttpUtil OkHttoPost(String url, FormBody formBody){
//创建 clench 对象
OkHttpClient okHttpClient = new OkHttpClient();
//获取Request
Request request = new Request.Builder().url(url).post(formBody).build();
okHttpClient.newCall(request).enqueue(new Callback() {
/**
* 失败回调方法
* @param call
* @param e
*/
@Override
public void onFailure(Call call, IOException e) {
Message message = new Message();
message.what = 1;
message.obj = e.getMessage();
mHandler.sendMessage(message);
}
/**
* 成功回调方法
* @param call
* @param response
* @throws IOException
*/
@Override
public void onResponse(Call call, Response response) throws IOException {
Message message = new Message();
message.what = 0;
message.obj = response.body().string();
mHandler.sendMessage(message);
}
});
return this;
}
//定义一个接口,进行回调
public interface OkHttpListener{
//成功
void OkHttpSuccess(String data);
//失败
void OkHttpError(String error);
}
}
创建Bean实体类
注意: 因为需要排序 ,我们在封装实体类的时候一定要注意 价钱 的类型
public class GoodsBean {
private String msg;
private String code;
private String page;
private List<DataBean> data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
private double bargainPrice;
private String createtime;
private String detailUrl;
private String images;
private int itemtype;
private int pid;
private double price;
private int pscid;
private int salenum;
private int sellerid;
private String subhead;
private String title;
public double getBargainPrice() {
return bargainPrice;
}
public void setBargainPrice(double bargainPrice) {
this.bargainPrice = bargainPrice;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public String getDetailUrl() {
return detailUrl;
}
public void setDetailUrl(String detailUrl) {
this.detailUrl = detailUrl;
}
public String getImages() {
return images;
}
public void setImages(String images) {
this.images = images;
}
public int getItemtype() {
return itemtype;
}
public void setItemtype(int itemtype) {
this.itemtype = itemtype;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getPscid() {
return pscid;
}
public void setPscid(int pscid) {
this.pscid = pscid;
}
public int getSalenum() {
return salenum;
}
public void setSalenum(int salenum) {
this.salenum = salenum;
}
public int getSellerid() {
return sellerid;
}
public void setSellerid(int sellerid) {
this.sellerid = sellerid;
}
public String getSubhead() {
return subhead;
}
public void setSubhead(String subhead) {
this.subhead = subhead;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
}
MVP
1.创建一个CallBack接口
public interface ICallBack {
void onSuccess(List<GoodsBean.DataBean> dataBeans);
void onFailed(String error);
}
2.创建一个view层接口
public interface GoodsView {
void onGoodsSuccess(List<GoodsBean.DataBean> dataBeans);
void onGoodsFailed(String error);
}
3.在model层创建一个类
public class GoodsModel {
public void goodsData(final List<GoodsBean.DataBean> dataBeans, int page, int sort, final ICallBack callBack) {
page = 1;
//http://www.zhaoapi.cn/product/searchProducts?keywords=%E6%89%8B%E6%9C%BA&page=1&sort=1
final String goodsUrl = "http://www.zhaoapi.cn/product/searchProducts?keywords=%E6%89%8B%E6%9C%BA&page=" + page + "&sort=" + sort;
new OkHttpUtil().OkHttpGet(goodsUrl).setOkHttpListener(new OkHttpUtil.OkHttpListener() {
@Override
public void OkHttpSuccess(String data) {
Gson gson = new Gson();
GoodsBean goodsBean = gson.fromJson(data, GoodsBean.class);
List<GoodsBean.DataBean> beans = goodsBean.getData();
if (goodsBean.getCode().equals("0")) {
callBack.onSuccess(beans);
} else {
callBack.onFailed(goodsBean.getMsg());
}
}
@Override
public void OkHttpError(String error) {
}
});
}
}
4.在presenter层创建一个类,进行view层和model层的交互与解绑
public class GoodsPresenter {
private GoodsView mGoodsView;
private GoodsModel mGoodsModel;
public GoodsPresenter(GoodsView goodsView) {
mGoodsView = goodsView;
mGoodsModel = new GoodsModel();
}
//解绑
public void datechView() {
mGoodsView = null;
}
public void goodsData(List<GoodsBean.DataBean> dataBeans, int page, int sort) {
page = 1;
mGoodsModel.goodsData(dataBeans, page, sort, new ICallBack() {
@Override
public void onSuccess(List<GoodsBean.DataBean> dataBeans) {
mGoodsView.onGoodsSuccess(dataBeans);
}
@Override
public void onFailed(String error) {
mGoodsView.onGoodsFailed(error);
}
});
}
}
XRecyclerView适配器
public class MyXRecyclerViewAdapter extends RecyclerView.Adapter<MyXRecyclerViewAdapter.MyGoodsViewHolder> {
private Context mContext;
private List<GoodsBean.DataBean> mDataBeans = new ArrayList<>();
public MyXRecyclerViewAdapter(Context context, List<GoodsBean.DataBean> dataBeans) {
mContext = context;
mDataBeans = dataBeans;
}
//更新适配器
public void update(List<GoodsBean.DataBean> dataBeans) {
mDataBeans = dataBeans;
notifyDataSetChanged();
}
@NonNull
@Override
public MyGoodsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.goods_view, viewGroup, false);
MyGoodsViewHolder holder = new MyGoodsViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull final MyGoodsViewHolder myGoodsViewHolder, final int i) {
String images = mDataBeans.get(i).getImages();
//分割字符串
String[] split = images.split("\\|");
for (int j = 0; j < images.length(); j++) {
Glide.with(mContext).load(split[0]).into(myGoodsViewHolder.mImageViewGoodsImg);
}
myGoodsViewHolder.mTextViewTitle.setText(mDataBeans.get(i).getTitle());
myGoodsViewHolder.mTextViewPrice.setText(mDataBeans.get(i).getPrice() + "");
myGoodsViewHolder.mTextViewSalenum.setText(mDataBeans.get(i).getSalenum() + "");
myGoodsViewHolder.mImageViewGoodsImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext, "点击了: " + mDataBeans.get(i).getTitle(), Toast.LENGTH_SHORT).show();
mGoodsClick.onGoodsClick(i);
}
});
}
@Override
public int getItemCount() {
return mDataBeans == null ? 0 : mDataBeans.size();
}
class MyGoodsViewHolder extends RecyclerView.ViewHolder {
ImageView mImageViewGoodsImg;
TextView mTextViewTitle, mTextViewPrice, mTextViewSalenum;
public MyGoodsViewHolder(@NonNull View itemView) {
super(itemView);
mImageViewGoodsImg = itemView.findViewById(R.id.goods_img);
mTextViewTitle = itemView.findViewById(R.id.goods_title);
mTextViewPrice = itemView.findViewById(R.id.goods_price);
mTextViewSalenum = itemView.findViewById(R.id.goods_salenum);
}
}
private goodsClick mGoodsClick;
public void setGoodsClick(goodsClick goodsClick) {
mGoodsClick = goodsClick;
}
//自定义接口
public interface goodsClick {
void onGoodsClick(int position);
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements GoodsView, View.OnClickListener {
private ImageView mImgBack;
private SearchView mEdTxtView;
private ImageView mImgDan;
/**
* 综合
*/
private Button mTxtZh;
/**
* 销量
*/
private Button mTxtXl;
/**
* 价格
*/
private Button mTxtJg;
/**
* 筛选
*/
private Button mTxtSx;
private XRecyclerView mXRv;
private GoodsPresenter mGoodsPresenter;
private List<GoodsBean.DataBean> mDataBeans = new ArrayList<>();
private MyXRecyclerViewAdapter mMyXRecyclerViewAdapter;
private int pager = 1;
private int sort = 0;
//先定义一个布尔值用来切换图片
private boolean b = false;
private Intent mIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
//创建presenter层实例
mGoodsPresenter = new GoodsPresenter(this);
mGoodsPresenter.goodsData(mDataBeans, pager, sort);
mXRv.setPullRefreshEnabled(true);//开启下拉刷新
mXRv.setLoadingMoreEnabled(true);//开启上拉加载更多
mXRv.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {//下拉刷新
mGoodsPresenter.goodsData(mDataBeans, pager, sort);
mXRv.refreshComplete();
}
@Override
public void onLoadMore() {//上拉加载更多
pager++;//每次加一
mGoodsPresenter.goodsData(mDataBeans, pager, sort);
mMyXRecyclerViewAdapter.update(mDataBeans);
mMyXRecyclerViewAdapter.notifyDataSetChanged();
mXRv.refreshComplete();
}
});
//线性布局管理器
mXRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
}
//初始化控件
private void initView() {
mImgBack = (ImageView) findViewById(R.id.img_back);
mEdTxtView = (SearchView) findViewById(R.id.ed_txt_view);
mImgDan = (ImageView) findViewById(R.id.img_dan);
mTxtZh = (Button) findViewById(R.id.txt_zh);
mTxtXl = (Button) findViewById(R.id.txt_xl);
mTxtJg = (Button) findViewById(R.id.txt_jg);
mTxtSx = (Button) findViewById(R.id.txt_sx);
mXRv = (XRecyclerView) findViewById(R.id.x_rv);
mImgBack.setOnClickListener(this);
mImgDan.setOnClickListener(this);
mTxtZh.setOnClickListener(this);
mTxtXl.setOnClickListener(this);
mTxtJg.setOnClickListener(this);
mTxtSx.setOnClickListener(this);
mXRv.setOnClickListener(this);
}
/**
* 成功
*
* @param dataBeans
*/
@Override
public void onGoodsSuccess(final List<GoodsBean.DataBean> dataBeans) {
mMyXRecyclerViewAdapter = new MyXRecyclerViewAdapter(this, dataBeans);
mXRv.setAdapter(mMyXRecyclerViewAdapter);
mMyXRecyclerViewAdapter.update(dataBeans);
mMyXRecyclerViewAdapter.notifyDataSetChanged();
mMyXRecyclerViewAdapter.setGoodsClick(new MyXRecyclerViewAdapter.goodsClick() {
@Override
public void onGoodsClick(int position) {
mIntent = new Intent(MainActivity.this, CartActivity.class);
String url = dataBeans.get(position).getDetailUrl();
int pid = dataBeans.get(position).getPid();
String replace = url.replace("https", "http");
mIntent.putExtra("url",replace+pid);
startActivity(mIntent);
}
});
}
/**
* 失败
*
* @param error
*/
@Override
public void onGoodsFailed(String error) {
Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.img_back:
this.finish();
break;
case R.id.img_dan:
checkIv(v);
break;
case R.id.txt_zh://综合排序
mGoodsPresenter.goodsData(mDataBeans, pager, 0);
break;
case R.id.txt_xl:///销量排序
mGoodsPresenter.goodsData(mDataBeans, pager, 1);
break;
case R.id.txt_jg://价格排序
mGoodsPresenter.goodsData(mDataBeans, pager, 2);
break;
case R.id.txt_sx:
break;
}
}
public void checkIv(View v){
Toast.makeText(MainActivity.this,"点击了切换视图按钮",Toast.LENGTH_SHORT).show();
if (b==false) {
//点击后想要变成什么要的布局样式就搞一个你的需求
mXRv.setLayoutManager(new GridLayoutManager(this,2));
//给布尔值重新赋值
b = true;
//给点击按钮的图片重新赋值
mImgDan.setImageResource(R.drawable.duo);
}else if (b==true) {
mXRv.setLayoutManager(new LinearLayoutManager(this));
//给布尔值重新赋值
b = false;
//给点击按钮的图片重新赋值
mImgDan.setImageResource(R.drawable.dan);
}
}
}
xml布局
<?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"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.7"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_back"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="1"
android:src="@drawable/back" />
<SearchView
android:id="@+id/ed_txt_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:layout_weight="7.7"
android:background="@drawable/shou_shape_bg" />
<ImageView
android:id="@+id/img_dan"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="1.3"
android:checked="true"
android:src="@drawable/dan" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.7"
android:orientation="horizontal">
<RadioGroup
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<RadioButton
android:id="@+id/txt_zh"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg"
android:button="@null"
android:checked="true"
android:gravity="center"
android:text="综合"
android:textSize="20sp" />
<RadioButton
android:id="@+id/txt_xl"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg"
android:button="@null"
android:gravity="center"
android:text="销量"
android:textSize="20sp" />
<RadioButton
android:id="@+id/txt_jg"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg"
android:button="@null"
android:gravity="center"
android:text="价格"
android:textSize="20sp" />
<RadioButton
android:id="@+id/txt_sx"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/btn_bg"
android:button="@null"
android:gravity="center"
android:text="筛选"
android:textSize="20sp" />
</RadioGroup>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8.6">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/x_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
条目布局
<?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"
android:layout_margin="5dp">
<ImageView
android:id="@+id/goods_img"
android:layout_width="100dp"
android:layout_height="120dp"
android:background="@mipmap/ic_launcher" />
<TextView
android:id="@+id/goods_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/goods_img"
android:lines="2"
android:ellipsize="end"
android:text="XXX"
android:textSize="20sp" />
<TextView
android:id="@+id/xl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/$"
android:layout_toRightOf="@id/goods_img"
android:text="销量:"
android:lines="1"
android:ellipsize="end"
android:textColor="#0c54e4"
android:textSize="12sp" />
<TextView
android:id="@+id/goods_salenum"
android:layout_above="@id/goods_price"
android:layout_marginLeft="120dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="XXXX"
android:lines="1"
android:ellipsize="end"
android:textColor="#0c54e4"
android:textSize="12sp" />
<TextView
android:id="@+id/$"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/goods_img"
android:layout_toRightOf="@id/goods_img"
android:text="¥:"
android:lines="1"
android:ellipsize="end"
android:textColor="#ea1414"
android:textSize="12sp" />
<TextView
android:id="@+id/goods_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/goods_img"
android:layout_toRightOf="@id/$"
android:text="XXXX"
android:lines="1"
android:ellipsize="end"
android:textColor="#ea1414"
android:textSize="12sp" />
</RelativeLayout>
点击条目跳转到详情界面
public class CartActivity extends AppCompatActivity {
private WebView mWv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
initView();
//支持js语言
mWv.getSettings().setJavaScriptEnabled(true);
// 缩放至屏幕的大小
mWv.getSettings().setLoadWithOverviewMode(true);
//支持缩放
mWv.getSettings().setSupportZoom(true);
//取值
Intent intent = getIntent();
//获取Intent中的数据
String url = intent.getStringExtra("url");
//把字符串赋值给输入框
mWv.loadUrl(url);
//设置用自己的浏览器打开
mWv.setWebViewClient(new MyWebViewClient());
}
private void initView() {
mWv = (WebView) findViewById(R.id.wv);
}
//自定义浏览器
class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
}
//预防内存泄露
@Override
protected void onPause() {
super.onPause();
finish();
}
}
WebView布局
<?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"
android:orientation="vertical"
tools:context=".activity.CartActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>