//MainActivity界面
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
//列表页
public class MainActivity extends AppCompatActivity implements DataView {
@Bind(R.id.grid_icon)
ImageView gridIcon;
@Bind(R.id.find)
Button find;
@Bind(R.id.xRecyclerView)
XRecyclerView xRecyclerView;
@Bind(R.id.editWords)
EditText editWords;
private int num = 1; //判断变量改变布局
private int page = 1; //初始化页数数据
private MyAdapter adapter;
private Handler handler = new Handler();
private DataPresenter dataPresenter = new DataPresenter(this,this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//默认显示一页数据
dataPresenter.getData("笔记本","1");
}
//view 层 的方法 用来更新ui
@Override
public void showView(ProductsBean productsBean) {
//设置线性布局管理器,加载数据
if (num % 2 == 1) {
//设置线性布局管理器,加载数据
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
xRecyclerView.setLayoutManager(layoutManager);
gridIcon.setBackgroundResource(R.drawable.kind_grid);
}
//设置布局适配器,,,线性布局管理器,加载数据
adapter = new MyAdapter(MainActivity.this, productsBean);
xRecyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new MyAdapter.SetMyOnClickListener() {
@Override
public void onClick(View v, int position, String url) {
Toast.makeText(MainActivity.this, ""+position, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,WebActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}
});
//XRecyclerview的上拉下拉方法
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
//在子线程内上拉刷新数据
dataPresenter.getData(editWords.getText().toString(),"1");
adapter.notifyDataSetChanged();
xRecyclerView.refreshComplete();
}
},800);
}
@Override
public void onLoadMore() {
//在子线程内下拉加载数据
handler.postDelayed(new Runnable() {
@Override
public void run() {
page++;
dataPresenter.getData(editWords.getText().toString(),page+"");
adapter.notifyDataSetChanged();
xRecyclerView.loadMoreComplete();
}
},800);
}
});
}
@OnClick({R.id.grid_icon, R.id.find})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.grid_icon:
//根据num变量是奇数还是偶数来判断加载哪种布局,并返回对应布局的图片
num++;
if (num % 2 == 0) {
//设置网格布局管理器,加载数据
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
xRecyclerView.setLayoutManager(layoutManager);
gridIcon.setBackgroundResource(R.drawable.kind_grid);
}
if (num % 2 == 1) {
//设置线性布局管理器,加载数据
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
xRecyclerView.setLayoutManager(layoutManager);
gridIcon.setBackgroundResource(R.drawable.kind_liner);
}
break;
case R.id.find:
//点击搜索按钮时触发presenter的获取数据方法
dataPresenter.getData(editWords.getText().toString(),"1");
break;
default:
break;
}
}
//实现presenter内部的防止内存溢出方法
@Override
protected void onDestroy() {
super.onDestroy();
dataPresenter.destory();
}
}
//MyDataModel层的接口实现类
import okhttp3.Callback;
/**
* model层,查询数据的接口实现类
*/
class MyDataModel {
//传三个参数(公共请求参数) 一个是分页加载时用到的 page 还有 输入框内搜索的值,还有callback 用来在presenter内拿出bean
public void getData(String keywords, String page, Callback callback ){
OkHttp3Utils.doGet("http://120.27.23.105/product/searchProducts?keywords="+keywords+"&page="+page+"&source=android",callback);
}
}
//model层,查询数据的接口实现类
public interface SearchModel {
public void getData(String keywords, String page, okhttp3.Callback callback);
}
//辅助类Application
import android.app.Application;
//全局初始化Application类
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//配置imageLoader
ImageLoaderUtil.init(this);
}
}
//DataView 方法
public interface DataView {
public void showView(ProductsBean productsBean); //成功获取数据
}
//获取图片的辅助类 自己加权限
import android.content.Context;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import java.io.File;
public class ImageLoaderUtil {
/**
* 初始化imageLoader
* @param context
*/
public static void init(Context context) {
//1.获取配置config对象
File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPoolSize(3) // default 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiscCache(cacheDir)) // default 可以自定义缓存路径
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
.diskCacheFileCount(100) // 可以缓存的文件数量
// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
.imageDownloader(new BaseImageDownloader(context)) // default
.imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs() // 打印debug log
.build(); //开始构建
//2.初始化配置...ImageLoader.getInstance()图片加载器的对象,单例模式
ImageLoader.getInstance().init(config);
}
/**
* imageLoader加载图片的默认选项
* @return
*/
public static DisplayImageOptions getDefaultOption(){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的默认图片
.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
.resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位
.delayBeforeLoading(1000) // 下载前的延迟时间
.cacheInMemory(true) // default 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型
.displayer(new SimpleBitmapDisplayer()) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20)
.build();
return options;
}
/**
* imageLoader加载圆角图片....指定圆角的大小
* @return
*/
public static DisplayImageOptions getRoundedOption(int corner){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
.resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位
.delayBeforeLoading(1000) // 下载前的延迟时间
.cacheInMemory(true) // default 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中
.considerExifParams(true) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
.bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型
.displayer(new RoundedBitmapDisplayer(corner)) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20)
.build();
return options;
}
}
//自定义的拦截器 自己加权限
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* 拦截器类
*/
//自定义应用拦截器
public class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
// logger.info(String.format("Sending request %s on %s%n%s",
// request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
// logger.info(String.format("Received response for %s in %.1fms%n%s",
// response.request().url(), (t2 - t1) / 1e6d, response.headers()));
System.out.println("t2 = " + (t2-t1));
return response;
}
}
//创建适配器adapter方法
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.ImageLoader;
import butterknife.Bind;
import butterknife.ButterKnife;
//自定义适配器
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = "MyAdapter";
private Context context;
private ProductsBean productsBean;
private SetMyOnClickListener setMyOnClickListener;
private int position;
public MyAdapter(Context context, ProductsBean productsBean) {
this.context = context;
this.productsBean = productsBean;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, null);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: =============="+viewType+"position-======"+position);
setMyOnClickListener.onClick(v,position,productsBean.getData().get(position).getDetailUrl());
}
});
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Log.d(TAG, "onBindViewHolder: ----------------"+position);
this.position = position;
//设置条目信息
ItemViewHolder viewHolder = (ItemViewHolder) holder;
viewHolder.title.setText("标题: "+productsBean.getData().get(position).getTitle() );
viewHolder.price.setText("价格: "+productsBean.getData().get(position).getPrice() );
String images = productsBean.getData().get(position).getImages();
String[] split = images.split("\\|");
//使用Glide加载图片容易闪烁,错位,效果不如imageloader好
//Glide.with(context).load(split[0]).into(viewHolder.image);
ImageLoader.getInstance().displayImage(split[0], viewHolder.image, ImageLoaderUtil.getDefaultOption());
}
@Override
public int getItemCount() {
return productsBean.getData() == null ? 0 : productsBean.getData().size();
}
static class ItemViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.image)
ImageView image;
@Bind(R.id.title)
TextView title;
@Bind(R.id.price)
TextView price;
public ItemViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
interface SetMyOnClickListener{
void onClick(View v,int position,String url);
}
public void setOnItemClickListener(SetMyOnClickListener setMyOnClickListener){
this.setMyOnClickListener = setMyOnClickListener;
}
}
//OkHttp3Utils工具类
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* 1. 类的用途
* 2. @author
*
*/
public class OkHttp3Utils {
private static OkHttpClient okHttpClient = null;
public OkHttp3Utils() {
}
private static OkHttpClient getOkHttpClient() {
synchronized (OkHttp3Utils.class) {
if (okHttpClient == null) {
okHttpClient = new OkHttpClient();
}
}
return okHttpClient;
}
//上传文件
public static void loadFile(String url, File file,String fileName){
OkHttpClient okHttpClient = getOkHttpClient();
//设置文件类型
RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"),file);
//设置请求体
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image",fileName,requestBody)
.build();
//请求方式
Request request = new Request.Builder().url(url).post(body).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("成功","成功");
}
});
}
/**
* 1.接口地址
* 2.接口回调
*/
public static void doGet(String url,Callback callback){
OkHttpClient okHttpClient = getOkHttpClient();
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(callback);
}
/**
* 1.地址
* 2.接口回调
* 3.请求体
*/
public static void doPost(String url, Map<String,String> map,Callback callback){
OkHttpClient okHttpClient = getOkHttpClient();
FormBody.Builder builder = new FormBody.Builder();
//遍历map集合 设置请求体
for (String mapKey : map.keySet()){
builder.add(mapKey,map.get(mapKey));
}
//设置请求方式
Request request = new Request.Builder().url(url).post(builder.build()).build();
//执行请求方式 接口回调
okHttpClient.newCall(request).enqueue(callback);
}
/**
*1.下载地址
*/
public static void doDown(String url,Callback callback){
OkHttpClient okHttpClient = getOkHttpClient();
Request build = new Request.Builder().url(url).build();
okHttpClient.newCall(build).enqueue(callback);
}
}
//工具类OkHttpUtils
import android.os.Handler;
import java.util.concurrent.TimeUnit;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class OkHttpUtils {
private Handler handler=new Handler();
public Handler getHandler(){
return handler;
}
//单例
private static OkHttpUtils okHttpUtils = null;
private OkHttpUtils(){};
public static OkHttpUtils getInstance(){
if(okHttpUtils == null){ //不适用拦截器时,可以把if判断内的代码去除
okHttpUtils = new OkHttpUtils();
client = new OkHttpClient.Builder()
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.addInterceptor(new LoggingInterceptor())
.build();
}
return okHttpUtils;
}
private static OkHttpClient client;
private void initOkHttpClient(){
if (client==null){
client=new OkHttpClient.Builder().build();
}
}
//公用的get请求方法 完成的功能不确定
public void doGet(String url, Callback callback){
initOkHttpClient();
Request request=new Request.Builder().url(url).build();
client.newCall(request).enqueue(callback);
}
}
//OnUiCallback接口
import android.os.Handler;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public abstract class OnUiCallback implements Callback {
private Handler handler=OkHttpUtils.getInstance().getHandler();
public abstract void onFailed(Call call,IOException e);
public abstract void onSuccess(String result);
@Override
public void onFailure(final Call call, final IOException e) {
//该方法就是把 线程post到handler所在的线程
handler.post(new Runnable() {
@Override
public void run() {
// e.getMessage()
onFailed(call,e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result=response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onSuccess(result);
}
});
}
}
//DataPresenter方法
import android.content.Context;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import okhttp3.Call;
/**
* presenter层,进行model和view层之间数据的交互
*/
class DataPresenter {
Context context;
private DataView dataView;
private MyDataModel dataModel;
//构造方法中声明view层,初始化model层数据,将 mvp三层关联
public DataPresenter(Context context, DataView dataView) {
this.context = context;
this.dataView = dataView;
dataModel = new MyDataModel();
}
//调用model层接口,上拉加载下拉刷新
public void getData(String keyword,String page){
dataModel.getData(keyword, page, new OnUiCallback() {
@Override
public void onFailed(Call call, IOException e) {
//数据获取//失败方法
}
@Override
public void onSuccess(String result) {
//获取数据成功时将放回的json 变成bean
Log.i("返回数据", "结果: "+result.toString());
ProductsBean bean = new Gson().fromJson(result, ProductsBean.class);
dataView.showView(bean);
}
});
}
//用来防止内存溢出
public void destory(){
this.dataView = null;
}
}
//json串 自己拼接如不会直接用
public class ProductsBean {
/**
* msg : 查询成功
* code : 0
* data : [{"bargainPrice":11800,"createtime":"2017-10-14T21:48:08","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","itemtype":2,"pid":77,"price":38999.99,"pscid":40,"salenum":7757,"sellerid":21,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"},{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","itemtype":1,"pid":78,"price":999,"pscid":40,"salenum":656,"sellerid":22,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"},{"bargainPrice":11800,"createtime":"2017-10-03T23:53:28","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","itemtype":0,"pid":79,"price":888,"pscid":40,"salenum":5454,"sellerid":23,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"},{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","itemtype":1,"pid":80,"price":777,"pscid":40,"salenum":776,"sellerid":1,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}]
* page : 3
*/
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 {
/**
* bargainPrice : 11800.0
* createtime : 2017-10-14T21:48:08
* detailUrl : https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1
* images : https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg
* itemtype : 2
* pid : 77
* price : 38999.99
* pscid : 40
* salenum : 7757
* sellerid : 21
* subhead : 购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)
* title : 全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G
*/
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;
}
}
}
//WebActivity 第二个页面 第一个页面点击跳转到第二个页面 展示网页
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
public class WebActivity extends AppCompatActivity {
private WebView web;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
web = findViewById(R.id.web);
Intent intent = getIntent();
String url = intent.getStringExtra("url");
web.loadUrl(url);
}
}
//第一个MianActivity的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/relative01">
<TextView
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="21sp"
android:text="搜索商品" />
<ImageView
android:background="@drawable/kind_grid"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:layout_height="35dp"
android:layout_width="35dp"
android:id="@+id/grid_icon" />
</RelativeLayout>
<View
android:id="@+id/view01"
android:background="#000"
android:layout_height="1dp"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_below="@+id/relative01"></View>
<RelativeLayout
android:layout_width="match_parent"
android:layout_below="@+id/view01"
android:layout_height="50dp"
android:id="@+id/relative02">
<EditText
android:layout_centerVertical="true"
android:layout_height="wrap_content"
android:layout_marginLeft="38dp"
android:layout_width="218dp"
android:id="@+id/editWords"
android:hint="请输入关键词"
android:textSize="21sp" />
<Button
android:text="搜索"
android:id="@+id/find"
android:layout_marginRight="38dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<View
android:id="@+id/view02"
android:background="#000"
android:visibility="visible"
android:layout_height="1dp"
android:layout_width="match_parent"
android:layout_below="@+id/relative02"></View>
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/xRecyclerView"
android:layout_below="@+id/view02"
android:layout_width="match_parent"
android:layout_height="match_parent" ></com.jcodecraeer.xrecyclerview.XRecyclerView>
</RelativeLayout>
//item的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:padding="5dp"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_height="100dp"
android:orientation="vertical"
android:layout_marginLeft="5dp"
android:layout_marginTop="10dp"
android:layout_width="match_parent" >
<TextView
android:id="@+id/title"
android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="wrap_content"/>
<TextView
android:id="@+id/price"
android:layout_weight="1"
android:layout_height="0dp"
android:layout_width="wrap_content"/>
</LinearLayout>
</LinearLayout>
//第二个MainActivity的布局
<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="c.example.wang.myapplication422zhou.WebActivity">
<WebView
android:id="@+id/web"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
</LinearLayout>
//联网权限
<uses-permission android:name="android.permission.INTERNET" />
//放在 defaultConfig 里边
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
//放在dependencies里边
compile 'com.squareup.okhttp3:okhttp:3.9.0'
implementation files('libs/gson-2.6.2.jar')
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
compile 'com.jakewharton:butterknife:7.0.0'