它用到的依赖:
mplementation 'com.squareup.okhttp3:okhttp:3.6.0'
implementation 'com.squareup.okio:okio:1.11.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.github.bumptech.glide:glide:4.9.0'
它用到的权限:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
先看MVP的View层接口
public interface IView {
//获取数据显示
public void getView(Object data);
}
看MVP的Psenter层接口
public interface Ipsenter {
//解收对象
void getpreData(String mTextEditString,String page,String count);
//解绑
void attchView(Iview iview);
void DetchView();
}
看MVP的Model层接口
public interface Imodel {
public void getDate(String mCallback, String mTextEditString, String page, MCallback count);
interface MCallback{
public void onSuccess(Object data);
public void onFail(Object erreo);
}
}
看MainAcitivity的代码
/**
* Mr_Zhao
* Mainactivity
* 2019/3/18
*/
public class MainActivity extends AppCompatActivity implements Iview {
private Psenter psenter;
private RecyclerView mRecyc;
private shopAdapter adapter;
private JsonBean jsonBean;
private EditText mEdit;
private Button mButton;
//这个是死值是初始显示数据
private String mTextEditString = "手机";
String page = "1";
String count = "10";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化P层
psenter = new Psenter();
psenter.attchView(this);
psenter.getpreData(mTextEditString, page, count);
initView();
}
private void initView() {
mRecyc = findViewById(R.id.mRecyc);
mEdit = findViewById(R.id.edi_cha);
mButton = findViewById(R.id.button_cha);
mRecyc.setLayoutManager(new GridLayoutManager(this, 2));
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//这个是活值是输入框的内容
String mTextEditString1 = mEdit.getText().toString();
if (!mTextEditString1.isEmpty()){
psenter.getpreData(mTextEditString1, page, count);
}else{
Toast.makeText(MainActivity.this,"不能为空",Toast.LENGTH_LONG).show();
}
}
});
}
@Override
public void getView(Object obj) {
if (obj != null) {
jsonBean = (JsonBean) obj;
adapter = new shopAdapter(MainActivity.this, jsonBean);
mRecyc.setAdapter(adapter);
//接口回调点击事件跳转详情页
adapter.setRecyclerviewListener(new shopAdapter.RecyclerviewListenner() {
@Override
public void callBack(int i, String id) {
Intent intent = new Intent(MainActivity.this, XActivity.class);
intent.putExtra("id", id);
startActivity(intent);
}
});
}
}
@Override
protected void onDestroy() {
super.onDestroy();
psenter.DetchView();
}
}
MainAcitivity展示用到Adapter,这是Adapter类
/**
* Mr_Zhao
* 适配器
* 2019/3/18
*/
public class shopAdapter extends RecyclerView.Adapter<shopAdapter.ViewHolder>{
Context context;
JsonBean jsonBean;
public shopAdapter(Context context, JsonBean jsonBean) {
this.context = context;
this.jsonBean = jsonBean;
}
@NonNull
@Override
public shopAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = (View) LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull shopAdapter.ViewHolder viewHolder, final int i) {
Glide.with(context).load(jsonBean.getResult().get(i).getMasterPic())
.into(viewHolder.image);
viewHolder.mText.setText(jsonBean.getResult().get(i).getCommodityName());
viewHolder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
recyclerviewListenner.callBack(v.getId(), String.valueOf(jsonBean.getResult().get(i).getCommodityId()));
}
});
}
@Override
public int getItemCount() {
return jsonBean.getResult().size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private final ImageView image;
private final TextView mText;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.mImage);
mText = itemView.findViewById(R.id.mText);
}
}
RecyclerviewListenner recyclerviewListenner;
public void setRecyclerviewListener(RecyclerviewListenner recyclerviewListenner) {
this.recyclerviewListenner = recyclerviewListenner;
}
public interface RecyclerviewListenner{
void callBack(int i, String id);
}
}
MainAcitivity实例到了P层类,这是P层类
/**
* Mr_Zhao
* p层
* 2019/3/18
*/
public class Psenter implements Ipsenter {
MainActivity mainActivity;
private Imodel model;
private SoftReference<Imodel> softReference;
@Override
public void getpreData(final String mTextEditString, final String page, String count) {
model.getDate(mTextEditString,page,count,new Imodel.MCallback() {
@Override
public void onSuccess(Object data) {
mainActivity.getView(data);
}
@Override
public void onFail(Object erreo) {
}
});
}
@Override
public void attchView(Iview iview) {
this.mainActivity= (MainActivity) iview;
model = new Model();
softReference = new SoftReference<Imodel>(model);
}
//防止内存泄漏 一行代码五分
@Override
public void DetchView() {
softReference.clear();
}
}
P层类实例到了M层类,这是M层类
/*
* 商品搜索列表
* */
public class Model implements Imodel {
//String Base_Url="http://172.17.8.100/small/commodity/v1/findCommodityByKeyword?keyword=1&page=1&count=71";
String Base_Url="http://172.17.8.100/small/commodity/v1/findCommodityByKeyword";
@Override
public void getDate(String mTextEditString ,String page,String count,final MCallback mCallback) {
Log.e("Tag",mTextEditString+"这个商品 "+page+"= page ="+ count+"M层");
OkHttp.getInstance().doGet(Base_Url+"?"+"keyword="+mTextEditString+"&page="+page+"&count="+count, JsonBean.class, new OkHttp.NetCallBack() {
@Override
public void LoadSuccess(Object obj) {
mCallback.onSuccess(obj);
Log.e("Tag",obj+"=====M层obj");
}
@Override
public void LoadFail() {
}
});
}
}
M层类调用工具类的方法,这是工具类
package com.bawei.zhaozhiwei2019.http;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttp {
private OkHttpClient client;
private static volatile OkHttp instance;
private Handler handler = new Handler();
//创建拦截器
private Interceptor getAppInterceptor()
{
Interceptor interceptor= new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.e("++++++","拦截前");
Response response = chain.proceed(request);
Log.e("++++++","拦截后");
return response;
}
};
return interceptor;
}
//添加拦截器
private OkHttp()
{
File file = new File(Environment.getExternalStorageDirectory(), "cache1");
client = new OkHttpClient().newBuilder()
.readTimeout(3000,TimeUnit.SECONDS)
.connectTimeout(3000,TimeUnit.SECONDS)
.addInterceptor(getAppInterceptor())
.cache(new Cache(file,10*1024))
.build();
}
//创建单例
public static OkHttp getInstance()
{
if(instance == null)
{
synchronized (OkHttp.class)
{
if(null == instance)
{
instance = new OkHttp();
}
}
}
return instance;
}
//封装doget方法
public void doGet(String url, final Class clazz, final NetCallBack netCallBack)
{
// 2. 创建一个请求对象
Request request = new Request.Builder()
.get()
.url(url)
.build();
//创建call对象
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException 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() {
netCallBack.LoadSuccess(o);
}
});
}
});
}
//封装dopost请求
public void doPost(String url, final Class clazz, String name,String pwd, final NetCallBack netCallBack)
{
//新建okhttp对象
client = new OkHttpClient();
/**
* 通过体传值
*/
FormBody build = new FormBody.Builder()
.add("phone", name)
.add("pwd", pwd)
.build();
Request request = new Request.Builder()
.url(url)
.post(build)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException 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() {
netCallBack.LoadSuccess(o);
}
});
}
});
}
public interface NetCallBack{
void LoadSuccess(Object obj);
void LoadFail();
}
}
XActivity详情代码
public class XActivity extends AppCompatActivity{
public static final String TAG="XiangActivity";
private int id;
bean bean1;
public static final String BaseUrl="http://172.17.8.100/small/commodity/v1/findCommodityDetailsById";
private String id1;
private ViewPager pager;
private WebView webView;
private TextView text_image;
private TextView textView1;
private TextView item_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_x);
pager = findViewById(R.id.pager);
webView = findViewById(R.id.web);
text_image = findViewById(R.id.text_image);
textView1 = findViewById(R.id.text1);
item_text = findViewById(R.id.item_text);
Intent intent = getIntent();
id1 = intent.getStringExtra("id");
Toast.makeText(XActivity.this,id1+"id",Toast.LENGTH_LONG).show();
if (!id1.isEmpty()){
getdata(id1);
}
}
private void getdata(final String id){
//新的一个bean类,封装上面接口
OkHttp.getInstance().doGet(BaseUrl + "?commodityId=" + id, bean.class, new OkHttp.NetCallBack() {
@Override
public void LoadSuccess(Object obj) {
bean1= (bean) obj;
Log.i(TAG, "LoadSuccess: "+bean1.getResult().getCommodityName());
bean.ResultBean result = ((bean) obj).getResult();
String details = result.getDetails();
webView.loadData(details,"text/html","UTF-8");
//设置webview本页加载数据
webView.setWebViewClient(new WebViewClient());
final WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
String picture = result.getPicture();
int price = result.getPrice();
String describe = result.getDescribe();
String commodityName = result.getCommodityName();
item_text.setText("¥:"+price+"");
textView1.setText(describe);
String[] split = picture.split(",");
final ArrayList<ImageView> imageViews = new ArrayList<>();
for (int i=0;i<split.length;i++){
String s = split[i];
ImageView imageView = new ImageView(XActivity.this);
Glide.with(XActivity.this).load(split[i]).into(imageView);
imageViews.add(imageView);
}
pager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return imageViews.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view==o;
}
//得自己打粗来
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView imageView = imageViews.get(position);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
});
}
@Override
public void LoadFail() {
}
});
}
}
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="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
<include
android:id="@+id/sou"
layout="@layout/sou_item"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/mRecyc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints" />
</LinearLayout>
搜索框布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:background="#ccd"
android:orientation="horizontal"
android:layout_height="?attr/actionBarSize">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_background"
tools:ignore="Suspicious0dp" />
<EditText
android:id="@+id/edi_cha"
android:layout_width="0dp"
android:hint="卫衣"
android:singleLine="true"
android:layout_weight="7"
android:layout_height="match_parent" />
<Button
android:id="@+id/button_cha"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:gravity="center"
android:textSize="20sp"
android:text="搜索"/>
</LinearLayout>
</LinearLayout>
Adapter设置显示布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/image_view"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/text_view"
android:layout_weight="8"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
</RelativeLayout>
XActivity布局
<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"
>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="300dp"
android:id="@+id/pager"
></android.support.v4.view.ViewPager>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_image"
android:textColor="@android:color/holo_red_dark"
android:textSize="20dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text1"
android:textSize="30dp"
android:textColor="@android:color/holo_orange_light"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item_text"
android:textSize="30dp"
android:textColor="@android:color/holo_blue_light"
/>
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/web"
></WebView>
</LinearLayout>
public static Okhttp getInstance(){
if (Internal.instance==null){
synchronized (Okhttp.class){
if (null== Internal.instance){
interce = new Okhttp();
}
}
return interce;
}
}
public void doGet(String url, Callback callback){
client = new OkHttpClient();
request = new Request.Builder()
.get()
.url(url)
.build();
client.newCall(request).enqueue(callback);
}