1. 项目框架:MVP;注意:避免内存泄漏;
2. 图片加载: Universal-Image-Loader或Glide图片加载框架
3.网络加载框架:OkHttp
4. 自定义应用拦截器,封装公共请求参数(注意:必须通过拦截器封装公共请求参数,否则无法请求数据,判0分)
公共请求参数,在我们项目研发过程中,作用非常大。封装公共请求承参数之后,那么所有的接口都会默认携带这些公共参数,达到复用的效果。
公共请求参数:source=android
参数名称:source
参数值:android
类型:String
是否必传:是
5. 数据展示使用RecylerView;
二、业务逻辑需求:
1. 搜索框输入关键字(笔记本、手机),其他关键词没有数据,点击搜索实现如图效果;
2. 图1是列表布局,图2是网格布局;
3. 通过右上角按钮点击切换列表布局和网格布局,按钮随着切换;
4. 实现下拉刷新展示第一页数据、上拉加载更多实现分页功能。
三、实现
通过文字或流程图等分析需求,形成完整解决问题思路;
代码规范,界面美观
MainActivity
import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import com.example.week2moni.interfacee.INewsView; import com.example.week2moni.Bean.JavaBean; import com.example.week2moni.adatper.NewsListAdapter; import com.example.week2moni.prestener.NewsPresenter; import com.example.week2moni.R; import com.jwenfeng.library.pulltorefresh.BaseRefreshListener; import com.jwenfeng.library.pulltorefresh.PullToRefreshLayout; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements INewsView { private RecyclerView re_view; private List<JavaBean.DataBean> list; private NewsListAdapter adapter; private Button btn_sousuo; private EditText et_sousuo; private NewsPresenter presenter; private ImageView right; private boolean flag = true; private PullToRefreshLayout mpull; private int page = 1; private String show; @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); re_view = (RecyclerView) findViewById(R.id.re_view); btn_sousuo = (Button) findViewById(R.id.btn_sousuo); et_sousuo = (EditText) findViewById(R.id.et_sousuo); right = (ImageView) findViewById(R.id.right); mpull = (PullToRefreshLayout) findViewById(R.id.mpull); list = new ArrayList<>(); adapter = new NewsListAdapter(this, list,1); LinearLayoutManager manager = new LinearLayoutManager(this); re_view.setLayoutManager(manager); re_view.setAdapter(adapter); presenter = new NewsPresenter(); presenter.attachView(this); btn_sousuo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { show = et_sousuo.getText().toString().trim(); presenter.getNews(show,page); } }); right.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (flag){ adapter.notifyDataSetChanged(); adapter = new NewsListAdapter(MainActivity.this, list,2); right.setImageDrawable(getResources().getDrawable(R.drawable.lv_icon)); GridLayoutManager manager = new GridLayoutManager(MainActivity.this, 2); re_view.setLayoutManager(manager); re_view.setAdapter(adapter); flag = false; }else { adapter.notifyDataSetChanged(); adapter = new NewsListAdapter(MainActivity.this, list,1); right.setImageDrawable(getResources().getDrawable(R.drawable.grid_icon)); LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this); re_view.setLayoutManager(manager); re_view.setAdapter(adapter); flag = true; } return false; } }); mpull.setLayoutMode(MODE_APPEND);//设置模板 mpull.setRefreshListener(new BaseRefreshListener() { @Override public void refresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { page=1; presenter.getNews(show,page); mpull.finishRefresh(); } }, 3000); } @Override public void loadMore() { new Handler().postDelayed(new Runnable() { @Override public void run() { page++; presenter.getNews(show,page); mpull.finishLoadMore(); } }, 3000 ); } }); } @Override public void success(String tag, List<JavaBean.DataBean> news) { list.clear(); list.addAll(news); adapter.notifyDataSetChanged(); adapter.setOnItemClickListener(new NewsListAdapter.OnItemClickListener() { @Override public void onClick(int position) { Intent intent = new Intent(MainActivity.this, Main2Activity.class); String url = list.get(position).getDetailUrl(); intent.putExtra("url",url); startActivity(intent); } @Override public void onLongClick(int position) { } }); } @Override public void failed(String tag, Exception e) { } }
NewsListAdapter 适配器
import android.content.Context; import android.graphics.Paint; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.week2moni.Bean.JavaBean; import com.example.week2moni.R; import java.util.List; /** * Created by 知足 on 2017/12/9. */ public class NewsListAdapter extends RecyclerView.Adapter<NewsListAdapter.ViewHolder> { private Context context; private List<JavaBean.DataBean> list; private int count; public NewsListAdapter(Context context, List<JavaBean.DataBean> list, int count) { this.context = context; this.list = list; this.count = count; } private OnItemClickListener mOnItemClickListener; public interface OnItemClickListener{ void onClick( int position); void onLongClick( int position); } public void setOnItemClickListener(OnItemClickListener onItemClickListener ){ this. mOnItemClickListener=onItemClickListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (count==1){ View v = View.inflate(context, R.layout.item, null); ViewHolder holder = new ViewHolder(v); return holder; }else if (count==2){ View v = View.inflate(context, R.layout.item1, null); ViewHolder holder = new ViewHolder(v); return holder; } return null; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { String[] split = list.get(position).getImages().split("[|]"); Glide.with(context).load(split[0]).into(holder.item_img); holder.item_bargainPrice.setText("原价:¥"+list.get(position).getBargainPrice()); holder.item_bargainPrice.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG); //下划线 holder.item_bargainPrice.getPaint().setAntiAlias(true);//抗锯齿 holder.item_price.setText("折扣价:¥"+list.get(position).getPrice()); holder.item_title.setText(list.get(position).getTitle()); if( mOnItemClickListener!= null){ holder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); holder. itemView.setOnLongClickListener( new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onLongClick(position); return false; } }); } } @Override public int getItemCount() { if (list==null){ return 0; } return list.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private final ImageView item_img; private final TextView item_price; private final TextView item_bargainPrice; private final TextView item_title; public ViewHolder(View itemView) { super(itemView); item_img = itemView.findViewById(R.id.item_img); item_title = itemView.findViewById(R.id.item_title); item_price = itemView.findViewById(R.id.item_price); item_bargainPrice = itemView.findViewById(R.id.item_bargainPrice); } } }
JavaBean 包
public class JavaBean { /** * msg : 查询成功 * code : 0 * data : [{"bargainPrice":3455,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":1,"pid":56,"price":99,"pscid":39,"salenum":757,"sellerid":12,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":1599,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/1993026402.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5863/302/8961270302/97126/41feade1/5981c81cNc1b1fbef.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7003/250/1488538438/195825/53bf31ba/5981c57eN51e95176.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5665/100/8954482513/43454/418611a9/5981c57eNd5fc97ba.jpg!q70.jpg","itemtype":2,"pid":47,"price":111,"pscid":39,"salenum":757,"sellerid":3,"subhead":"碳黑色 32GB 全网通 官方标配 1件","title":"锤子 坚果Pro 特别版 巧克力色 酒红色 全网通 移动联通电信4G手机 双卡双待 碳黑色 32GB 全网通"},{"bargainPrice":3455,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":1,"pid":48,"price":222,"pscid":39,"salenum":656,"sellerid":4,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":6666,"createtime":"2017-10-10T16:01:31","detailUrl":"https://item.m.jd.com/product/5089273.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8284/363/1326459580/71585/6d3e8013/59b857f2N6ca75622.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9346/182/1406837243/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg","itemtype":0,"pid":46,"price":234,"pscid":39,"salenum":868,"sellerid":2,"subhead":"【iPhone新品上市】新一代iPhone,让智能看起来更不一样","title":"Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机"},{"bargainPrice":1999,"createtime":"2017-10-10T16:09:02","detailUrl":"https://item.m.jd.com/product/5025971.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t7210/232/3738666823/232298/9004583e/59c3a9a7N8de42e15.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8356/82/2107423621/109733/c019b8c6/59c3a9a6Ne9a4bdd7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t10219/74/25356012/171379/7d55e296/59c3a9a8N82fa6e02.jpg!q70.jpg","itemtype":0,"pid":49,"price":333,"pscid":39,"salenum":123,"sellerid":5,"subhead":"vivo X20 带你开启全面屏时代!逆光也清晰,照亮你的美!","title":"vivo X20 全面屏手机 全网通 4GB+64GB 金色 移动联通电信4G手机 双卡双待"},{"bargainPrice":3455,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":2,"pid":50,"price":444,"pscid":39,"salenum":54,"sellerid":6,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":3455,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":1,"pid":51,"price":555,"pscid":39,"salenum":424,"sellerid":7,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":3455,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":0,"pid":52,"price":666,"pscid":39,"salenum":212,"sellerid":8,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":2999,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/2385655.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t2068/298/2448145915/157953/7be197df/56d51a42Nd86f1c8e.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2437/128/1687178395/117431/bcc190c1/56d3fcbaNb2963d21.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2467/222/2263160610/95597/927b8a2f/56d3eafeNdecebeb6.jpg!q70.jpg","itemtype":2,"pid":53,"price":777,"pscid":39,"salenum":0,"sellerid":9,"subhead":"Super AMOLED三星双曲面2K 屏,支持无线充电!","title":"三星 Galaxy S7 edge(G9350)4GB+32GB 铂光金 移动联通电信4G手机 双卡双待"},{"bargainPrice":3455,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":0,"pid":54,"price":888,"pscid":39,"salenum":7575,"sellerid":10,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"}] * page : 1 */ 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 : 3455.0 * createtime : 2017-10-14T21:38:26 * detailUrl : https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends * images : https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg * itemtype : 1 * pid : 56 * price : 99.0 * pscid : 39 * salenum : 757 * sellerid : 12 * subhead : 【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机 * title : 小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】 */ 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; } } }
//接口
public interface CallBack { void onSuccess(String tag,Object o); void onFailed(String tag,Exception e); }
public interface INewsView { void success(String tag, List<JavaBean.DataBean> list); void failed(String tag,Exception e); }
mode层l拦截器
public class LoggingInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); HttpUrl url=original.url().newBuilder() .addQueryParameter("source","android") .build(); //添加请求头 Request request = original.newBuilder() .url(url) .build(); return chain.proceed(request); } }
p层
NewsPresenter
public class NewsPresenter { private INewsView inv; public void attachView(INewsView inv){ this.inv = inv; } public void getNews(String show,int page){ Map<String, String> map = new HashMap<>(); map.put("keywords",show); map.put("page",page+""); HttpUtils.getInstance().get("http://120.27.23.105/product/searchProducts", map, new CallBack() { @Override public void onSuccess(String tag, Object o) { JavaBean bean = (JavaBean) o; if (bean != null){ List<JavaBean.DataBean> data = bean.getData(); inv.success(tag,data); } } @Override public void onFailed(String tag, Exception e) { inv.failed(tag,e); } }, JavaBean.class,"news"); } public void detachView(){ if (inv!=null){ inv = null; } } }
utils层
public class GsonUtils { private static Gson instance; private GsonUtils(){ } public static Gson getInstance(){ if (instance==null){ instance = new Gson(); } return instance; } }
utils层
import android.os.Handler; import android.text.TextUtils; import com.example.week2moni.Model.LoggingInterceptor; import com.example.week2moni.interfacee.CallBack; import java.io.IOException; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * Created by 知足 on 2017/12/9. */ public class HttpUtils { private static Handler handler = new Handler(); private static volatile HttpUtils instance; private HttpUtils(){ } public static HttpUtils getInstance(){ if (null==instance){ synchronized (HttpUtils.class){ if (instance == null){ instance = new HttpUtils(); } } } return instance; } public void get(String url, Map<String,String> map, final CallBack callBack, final Class cls, final String tag){ if (TextUtils.isEmpty(url)){ return; } StringBuffer sb = new StringBuffer(); sb.append(url); if (url.contains("?")){ if (url.indexOf("?")==url.length()-1){ }else { sb.append("&"); } }else { sb.append("?"); } for (Map.Entry<String,String> entry:map.entrySet()){ sb.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } if (sb.indexOf("&")!=-1){ sb.deleteCharAt(sb.lastIndexOf("&")); } OkHttpClient client = new OkHttpClient .Builder() .addInterceptor(new LoggingInterceptor()) .build(); Request request = new Request.Builder() .get() .url(sb.toString()) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { callBack.onFailed(tag,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() { Object o; if (TextUtils.isEmpty(result)){ o = null; }else { o = GsonUtils.getInstance().fromJson(result, cls); } callBack.onSuccess(tag,o); } }); } }); } }
Main2Activity
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.example.week2moni.R; public class Main2Activity extends AppCompatActivity { private WebView web; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Intent intent = getIntent(); String url = intent.getStringExtra("url"); web = (WebView) findViewById(R.id.web); web.loadUrl(url); web.setWebViewClient(new WebViewClient()); WebSettings settings = web.getSettings(); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setJavaScriptEnabled(true); } }
activity-main
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.example.week2moni.activity.MainActivity"> <TextView android:id="@+id/tv_show" android:layout_width="match_parent" android:layout_height="40dp" android:text="搜索商品" android:textSize="25sp" android:gravity="center" /> <ImageView android:id="@+id/right" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/grid_icon" android:layout_alignParentRight="true" /> <RelativeLayout android:id="@+id/rel" android:layout_width="match_parent" android:layout_height="50dp" android:layout_below="@+id/tv_show" android:layout_alignParentStart="true"> <EditText android:id="@+id/et_sousuo" android:layout_width="300dp" android:layout_height="50dp" android:drawableLeft="@drawable/fdj" android:hint="请输入关键字" /> <Button android:id="@+id/btn_sousuo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/et_sousuo" android:text="搜索" /> </RelativeLayout> <com.jwenfeng.library.pulltorefresh.PullToRefreshLayout android:layout_width="match_parent" android:id="@+id/mpull" android:layout_below="@+id/rel" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/re_view" android:layout_width="match_parent" android:layout_height="wrap_content" ></android.support.v7.widget.RecyclerView> </com.jwenfeng.library.pulltorefresh.PullToRefreshLayout> </RelativeLayout>
activity2-main
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.example.week2moni.activity.Main2Activity"> <WebView android:id="@+id/web" android:layout_width="match_parent" android:layout_height="match_parent"></WebView> </RelativeLayout>
item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/item_img" android:layout_width="100dp" android:layout_height="100dp" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="100dp" android:layout_toRightOf="@+id/item_img"> <TextView android:id="@+id/item_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:text="title" android:textSize="16sp" /> <TextView android:id="@+id/item_bargainPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_title" android:text="售价" android:layout_marginTop="10dp" android:textColor="#ccc" android:textSize="14sp" /> <TextView android:id="@+id/item_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_title" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/item_bargainPrice" android:text="售价" android:layout_marginTop="10dp" android:textColor="#f00" android:textSize="14sp" /> </RelativeLayout> </LinearLayout>
item1
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/item_img" android:layout_width="200dp" android:layout_gravity="center" android:layout_height="200dp" /> <TextView android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="10dp" android:text="title" android:textSize="16sp" /> <TextView android:id="@+id/item_bargainPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_title" android:layout_gravity="center" android:text="售价" android:layout_marginTop="10dp" android:textColor="#ccc" android:textSize="14sp" /> <TextView android:id="@+id/item_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_gravity="center" android:text="售价" android:textColor="#f00" android:layout_marginBottom="15dp" android:textSize="14sp" /> </LinearLayout>
权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
依赖
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.google.code.gson:gson:2.8.2' compile 'com.github.bumptech.glide:glide:3.7.0' testCompile 'junit:junit:4.12' compile 'com.jwenfeng.pulltorefresh:library:1.0.3'