登陆注册 跳转商品列表


布局============================================================

main_activity----------------------------------------------------------------------------------------------

<?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="com.daydayup.day10_zhoukao.view.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="登录"
        android:textSize="25sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#999999" />

    <EditText
        android:id="@+id/mobile"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="手机号" />

    <EditText
        android:id="@+id/pwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登录" />

        <Button
            android:id="@+id/reg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="注册" />
    </LinearLayout>

</LinearLayout>

actvity_deatil---------------------------------------------------------------------------------------------------------

<?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"
    tools:context="com.daydayup.day10_zhoukao.view.DeatilActivity">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

</LinearLayout>

activity_reg----------------------------------------------------------------------------------------------------------------

<?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="com.daydayup.day10_zhoukao.view.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="注册"
        android:textSize="25sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#999999" />

    <EditText
        android:id="@+id/mobile"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="手机号" />

    <EditText
        android:id="@+id/pwd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <Button
            android:id="@+id/reg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="注册" />
    </LinearLayout>

</LinearLayout>

goods_list_layout------------------------------------------------------------------------------------------------------------

<?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="vertical">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:text="商品列表"
            android:textSize="25sp" />

        <ImageView
            android:id="@+id/goodslist_change"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_gravity="right"
            android:src="@drawable/grid_icon" />
    </FrameLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.75dp"
        android:background="#999999" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <com.daydayup.day10_zhoukao.view.custumview.MySearchView
            android:layout_width="0dp"
            android:id="@+id/mysearch"
            android:layout_height="40dp"
            android:layout_weight="1"></com.daydayup.day10_zhoukao.view.custumview.MySearchView>

        <TextView
            android:id="@+id/sousuo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="搜索" />
    </LinearLayout>

    <com.daydayup.day10_zhoukao.view.custumview.XListView
        android:id="@+id/goodslist_listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="visible"></com.daydayup.day10_zhoukao.view.custumview.XListView>

    <GridView
        android:id="@+id/goodslist_gridview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="2"
        android:visibility="gone"></GridView>
</LinearLayout>

item_layout---------------------------------------------------------------------------------------------------------------

<?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_pic"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:singleLine="true"
        android:id="@+id/item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="商品名" />

</LinearLayout>

item_layout_gridview-----------------------------------------------------------------------------------------------------

<?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="vertical">

    <ImageView
        android:id="@+id/item_pic"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:singleLine="true"
        android:id="@+id/item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="商品名" />

</LinearLayout>

layout_search-----------------------------------------------------------------------------------------------------------------

<?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="wrap_content"
    android:background="@drawable/search_bg"
    android:orientation="horizontal"
    android:padding="8dp">

    <ImageView
        android:layout_width="@dimen/search_height"
        android:layout_height="@dimen/search_height"
        android:src="@drawable/a_4" />

    <EditText
        android:id="@+id/search_content"
        android:layout_width="0dp"
        android:layout_height="@dimen/search_height"
        android:layout_weight="1"
        android:background="@null" />

    <ImageView
        android:layout_width="@dimen/search_height"
        android:layout_height="@dimen/search_height"
        android:src="@drawable/root" />

</LinearLayout>

list_item--------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:id="@+id/list_item_textview" android:textSize="16sp" android:textColor="#000" android:padding="5dp">
    

</TextView>

main---------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" android:background="#f0f0f0">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="hello" />

    <me.maxwin.view.XListView
        android:id="@+id/xListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:cacheColorHint="#00000000">
    </me.maxwin.view.XListView>

</LinearLayout>

xlistview_footer-------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:id="@+id/xlistview_footer_content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="10dp" >

        <ProgressBar
            android:id="@+id/xlistview_footer_progressbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:visibility="invisible" />

        <TextView
            android:id="@+id/xlistview_footer_hint_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/xlistview_footer_hint_normal" />
    </RelativeLayout>

</LinearLayout>

xlistview_header----------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="bottom" >

    <RelativeLayout
        android:id="@+id/xlistview_header_content"
        android:layout_width="fill_parent"
        android:layout_height="60dp" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:orientation="vertical" android:id="@+id/xlistview_header_text">

            <TextView
                android:id="@+id/xlistview_header_hint_textview"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/xlistview_header_hint_normal" />

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="3dp" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/xlistview_header_last_time"
                    android:textSize="12sp" />

                <TextView
                    android:id="@+id/xlistview_header_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="12sp" />
            </LinearLayout>
        </LinearLayout>

        <ImageView
            android:id="@+id/xlistview_header_arrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@id/xlistview_header_text"
            android:layout_centerVertical="true"
            android:layout_marginLeft="-35dp"
            android:src="@drawable/xlistview_arrow" />

        <ProgressBar
            android:id="@+id/xlistview_header_progressbar"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignLeft="@id/xlistview_header_text"
            android:layout_centerVertical="true"
            android:layout_marginLeft="-40dp"
            android:visibility="invisible" />
    </RelativeLayout>

</LinearLayout>

search_bg----------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <size
        android:width="50dp"
        android:height="@dimen/search_height" />
    <solid android:color="#55999999" />
    <corners android:radius="18dp" />

</shape>

View层=======================================================================

MianActivity================================================================

package com.daydayup.day10_zhoukao.view;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.daydayup.day10_zhoukao.R;
import com.daydayup.day10_zhoukao.model.ModelImpl;
import com.daydayup.day10_zhoukao.presenter.Presenter;

/**
 * 登录页
 */
public class MainActivity extends AppCompatActivity implements IMainView, View.OnClickListener {

    private EditText mobile;
    private EditText password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化界面
        initViews();
    }

    private void initViews() {
        mobile = findViewById(R.id.mobile);
        password = findViewById(R.id.pwd);
        Button login = findViewById(R.id.login);
        Button reg = findViewById(R.id.reg);


        login.setOnClickListener(this);
        reg.setOnClickListener(this);
    }

    //手机号
    @Override
    public String getMobile() {
        return mobile.getText().toString();
    }

    @Override
    public String getPassword() {
        return password.getText().toString();
    }

    @Override
    public void loginSuccess() {
        Toast.makeText(MainActivity.this, "成功---", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(MainActivity.this,GoodsListActivity.class));
    }

    @Override
    public void loginError() {
        Toast.makeText(MainActivity.this, "失败---请注册", Toast.LENGTH_SHORT).show();
    }

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.login:
                Presenter presenter = new Presenter();
                presenter.loginPresenter(new ModelImpl(),this);
                break;
            case R.id.reg:
                startActivity(new Intent(MainActivity.this,RegActivity.class));
                break;
        }
    }
}

RegActivity===================================================================

package com.daydayup.day10_zhoukao.view;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.daydayup.day10_zhoukao.R;
import com.daydayup.day10_zhoukao.model.ModelImpl;
import com.daydayup.day10_zhoukao.presenter.Presenter;

public class RegActivity extends AppCompatActivity implements View.OnClickListener, IRegView {
    private EditText mobile;
    private EditText password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reg);
        //初始化界面
        initViews();
    }

    private void initViews() {
        mobile = findViewById(R.id.mobile);
        password = findViewById(R.id.pwd);
        Button reg = findViewById(R.id.reg);
        reg.setOnClickListener(this);
    }

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.reg:
                Presenter presenter = new Presenter();
                presenter.regPresenter(new ModelImpl(), this);
                break;
        }
    }

    //获取手机号
    @Override
    public String getMobile() {
        return mobile.getText().toString();
    }

    //密码
    @Override
    public String getPassword() {
        return password.getText().toString();
    }

    //注册成功
    @Override
    public void regSuccess() {
        Toast.makeText(RegActivity.this, "注册成功---", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(RegActivity.this, GoodsListActivity.class));
    }

    //注册失败
    @Override
    public void regError() {
        Toast.makeText(RegActivity.this, "注册失败---", Toast.LENGTH_SHORT).show();
    }
}

IRegView接口======================================================

package com.daydayup.day10_zhoukao.view;

/**
 * 注册view
 */

public interface IRegView {
    //获手机号
    String getMobile();

    //获取密码
    String getPassword();

    //注册成功
    void regSuccess();

    //注册失败
    void regError();
}

IMianView接口=========================================================

package com.daydayup.day10_zhoukao.view;

/**
 * 登录view
 */

public interface IMainView {
    //获手机号
    String getMobile();

    //获取密码
    String getPassword();

    //登录成功
    void loginSuccess();

    //登录失败
    void loginError();
}

GoodsListActivity=============================================================

package com.daydayup.day10_zhoukao.view;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.daydayup.day10_zhoukao.R;
import com.daydayup.day10_zhoukao.model.GoosListBean;
import com.daydayup.day10_zhoukao.model.ModelImpl;
import com.daydayup.day10_zhoukao.model.MyAdater;
import com.daydayup.day10_zhoukao.model.MyAdater2;
import com.daydayup.day10_zhoukao.presenter.Presenter;
import com.daydayup.day10_zhoukao.view.custumview.MySearchView;
import com.daydayup.day10_zhoukao.view.custumview.XListView;

import java.util.List;

/**
 * 商品列表页
 */

public class GoodsListActivity extends Activity implements View.OnClickListener, IGoodsListView {

    private XListView listView;
    private GridView gridView;
    private static final String TAG = "GoodsListActivity---";
    private boolean flag = true;
    private ImageView change;
    private TextView sousuo;
    private MySearchView mySearchView;
    private int page = 1;
    private List<GoosListBean.DataBean> data;
    private MyAdater myAdater;
    private MyAdater2 myAdater2;
    private Presenter presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.goods_list_layout);
        //初始化界面
        initViews();
        //请求书
        presenter = new Presenter();
        presenter.showGoodsListToView(new ModelImpl(), this);

    }

    private void initViews() {
        sousuo = findViewById(R.id.sousuo);
        sousuo.setOnClickListener(this);
        mySearchView = findViewById(R.id.mysearch);
        change = findViewById(R.id.goodslist_change);
        change.setOnClickListener(this);
        listView = findViewById(R.id.goodslist_listview);
        gridView = findViewById(R.id.goodslist_gridview);
        //设置
        listView.setPullLoadEnable(true);
        listView.setPullRefreshEnable(true);

        listView.setXListViewListener(new XListView.IXListViewListener() {
            @Override
            public void onRefresh() {
                page = 1;
                presenter.showGoodsListToViewFresh(new ModelImpl(), GoodsListActivity.this);
            }

            @Override
            public void onLoadMore() {
                page++;
                presenter.showGoodsListToViewLoadMore(new ModelImpl(), GoodsListActivity.this);
            }
        });
        //
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String detailUrl = GoodsListActivity.this.data.get(position-1).getDetailUrl();
                Intent intent = new Intent(GoodsListActivity.this, DeatilActivity.class);
                intent.putExtra("url",detailUrl);
                startActivity(intent);
            }
        });
    }

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.goodslist_change:
                if (flag) {
                    change.setImageResource(R.drawable.lv_icon);
                    gridView.setVisibility(View.VISIBLE);
                    listView.setVisibility(View.GONE);
                } else {
                    change.setImageResource(R.drawable.grid_icon);
                    gridView.setVisibility(View.GONE);
                    listView.setVisibility(View.VISIBLE);
                }
                flag = !flag;
                break;

            case R.id.sousuo:
                presenter.showGoodsListToViewSouSuo(new ModelImpl(), GoodsListActivity.this);
                break;
        }
    }

    //展示商品列表的方法
    @Override
    public void showGoodsList(List<GoosListBean.DataBean> data) {
        this.data = data;
        Log.d(TAG, "showGoodsList: " + data);
        //展示
        myAdater = new MyAdater(GoodsListActivity.this, this.data);
        myAdater2 = new MyAdater2(GoodsListActivity.this, this.data);
        listView.setAdapter(myAdater);

        gridView.setAdapter(myAdater2);
    }

    //刷新
    @Override
    public void showGoodsListFresh(List<GoosListBean.DataBean> data) {
        this.data = data;
        myAdater.notifyDataSetChanged();
        myAdater2.notifyDataSetChanged();
        listView.stopRefresh();
    }

    //加载
    @Override
    public void showGoodsListLoadMore(List<GoosListBean.DataBean> data) {
        this.data.addAll(data);
        //展示
        myAdater = new MyAdater(GoodsListActivity.this, this.data);
        myAdater2 = new MyAdater2(GoodsListActivity.this, this.data);
        listView.setAdapter(myAdater);

        gridView.setAdapter(myAdater2);
        listView.stopLoadMore();
    }

    @Override
    public String getContent() {
        return mySearchView.getContent();
    }

    //页数
    @Override
    public String getPage() {
        return page + "";
    }

    @Override
    public void showGoodsListSousuo(List<GoosListBean.DataBean> data) {
        this.data=data;
        myAdater = new MyAdater(GoodsListActivity.this, this.data);
        myAdater2 = new MyAdater2(GoodsListActivity.this, this.data);
        listView.setAdapter(myAdater);

        gridView.setAdapter(myAdater2);
    }
}

IGoodsListView================================================================

package com.daydayup.day10_zhoukao.view;

import com.daydayup.day10_zhoukao.model.GoosListBean;

import java.util.List;

/**
 * 商品列表的View接口
 */

public interface IGoodsListView {
    //展示商品列表的方法
    void showGoodsList(List<GoosListBean.DataBean> data);
//    刷新
    void showGoodsListFresh(List<GoosListBean.DataBean> data);
//    加载
    void showGoodsListLoadMore(List<GoosListBean.DataBean> data);

    String getContent();
    String getPage();

    void showGoodsListSousuo(List<GoosListBean.DataBean> data);

}

DeatilActivity===================================================================

package com.daydayup.day10_zhoukao.view;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.daydayup.day10_zhoukao.R;

public class DeatilActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deatil);
        initViews();
        initDatas();
    }

    private void initDatas() {
        Intent intent = getIntent();
        String url = intent.getStringExtra("url");
        webView.loadUrl(url);
    }

    private void initViews() {

        webView = findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient());
        webView.setWebChromeClient(new WebChromeClient());

    }
}

XListViewHeader============================================================

/**
 * @file XListViewHeader.java
 * @create Apr 18, 2012 5:22:27 PM
 * @author Maxwin
 * @description XListView's header
 */
package com.daydayup.day10_zhoukao.view.custumview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.daydayup.day10_zhoukao.R;

public class XListViewHeader extends LinearLayout {
   private LinearLayout mContainer;
   private ImageView mArrowImageView;
   private ProgressBar mProgressBar;
   private TextView mHintTextView;
   private int mState = STATE_NORMAL;

   private Animation mRotateUpAnim;
   private Animation mRotateDownAnim;
   
   private final int ROTATE_ANIM_DURATION = 180;
   
   public final static int STATE_NORMAL = 0;
   public final static int STATE_READY = 1;
   public final static int STATE_REFRESHING = 2;

   public XListViewHeader(Context context) {
      super(context);
      initView(context);
   }

   /**
    * @param context
    * @param attrs
    */
   public XListViewHeader(Context context, AttributeSet attrs) {
      super(context, attrs);
      initView(context);
   }

   private void initView(Context context) {
      // 初始情况,设置下拉刷新view高度为0
      LayoutParams lp = new LayoutParams(
            LayoutParams.FILL_PARENT, 0);
      mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
            R.layout.xlistview_header, null);
      addView(mContainer, lp);
      setGravity(Gravity.BOTTOM);

      mArrowImageView = (ImageView)findViewById(R.id.xlistview_header_arrow);
      mHintTextView = (TextView)findViewById(R.id.xlistview_header_hint_textview);
      mProgressBar = (ProgressBar)findViewById(R.id.xlistview_header_progressbar);
      
      mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
            0.5f);
      mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
      mRotateUpAnim.setFillAfter(true);
      mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
            0.5f);
      mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
      mRotateDownAnim.setFillAfter(true);
   }

   public void setState(int state) {
      if (state == mState) return ;
      
      if (state == STATE_REFRESHING) {   // 显示进度
         mArrowImageView.clearAnimation();
         mArrowImageView.setVisibility(View.INVISIBLE);
         mProgressBar.setVisibility(View.VISIBLE);
      } else {   // 显示箭头图片
         mArrowImageView.setVisibility(View.VISIBLE);
         mProgressBar.setVisibility(View.INVISIBLE);
      }
      
      switch(state){
      case STATE_NORMAL:
         if (mState == STATE_READY) {
            mArrowImageView.startAnimation(mRotateDownAnim);
         }
         if (mState == STATE_REFRESHING) {
            mArrowImageView.clearAnimation();
         }
         mHintTextView.setText(R.string.xlistview_header_hint_normal);
         break;
      case STATE_READY:
         if (mState != STATE_READY) {
            mArrowImageView.clearAnimation();
            mArrowImageView.startAnimation(mRotateUpAnim);
            mHintTextView.setText(R.string.xlistview_header_hint_ready);
         }
         break;
      case STATE_REFRESHING:
         mHintTextView.setText(R.string.xlistview_header_hint_loading);
         break;
         default:
      }
      
      mState = state;
   }
   
   public void setVisiableHeight(int height) {
      if (height < 0)
         height = 0;
      LayoutParams lp = (LayoutParams) mContainer
            .getLayoutParams();
      lp.height = height;
      mContainer.setLayoutParams(lp);
   }

   public int getVisiableHeight() {
      return mContainer.getLayoutParams().height;
   }

}

XListViewFooter============================================================

/**
 * @file XFooterView.java
 * @create Mar 31, 2012 9:33:43 PM
 * @author Maxwin
 * @description XListView's footer
 */
package com.daydayup.day10_zhoukao.view.custumview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.daydayup.day10_zhoukao.R;

public class XListViewFooter extends LinearLayout {
   public final static int STATE_NORMAL = 0;
   public final static int STATE_READY = 1;
   public final static int STATE_LOADING = 2;

   private Context mContext;

   private View mContentView;
   private View mProgressBar;
   private TextView mHintView;
   
   public XListViewFooter(Context context) {
      super(context);
      initView(context);
   }
   
   public XListViewFooter(Context context, AttributeSet attrs) {
      super(context, attrs);
      initView(context);
   }

   
   public void setState(int state) {
      mHintView.setVisibility(View.INVISIBLE);
      mProgressBar.setVisibility(View.INVISIBLE);
      mHintView.setVisibility(View.INVISIBLE);
      if (state == STATE_READY) {
         mHintView.setVisibility(View.VISIBLE);
         mHintView.setText(R.string.xlistview_footer_hint_ready);
      } else if (state == STATE_LOADING) {
         mProgressBar.setVisibility(View.VISIBLE);
      } else {
         mHintView.setVisibility(View.VISIBLE);
         mHintView.setText(R.string.xlistview_footer_hint_normal);
      }
   }
   
   public void setBottomMargin(int height) {
      if (height < 0) return ;
      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();
      lp.bottomMargin = height;
      mContentView.setLayoutParams(lp);
   }
   
   public int getBottomMargin() {
      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();
      return lp.bottomMargin;
   }
   
   
   /**
    * normal status
    */
   public void normal() {
      mHintView.setVisibility(View.VISIBLE);
      mProgressBar.setVisibility(View.GONE);
   }
   
   
   /**
    * loading status 
    */
   public void loading() {
      mHintView.setVisibility(View.GONE);
      mProgressBar.setVisibility(View.VISIBLE);
   }
   
   /**
    * hide footer when disable pull load more
    */
   public void hide() {
      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();
      lp.height = 0;
      mContentView.setLayoutParams(lp);
   }
   
   /**
    * show footer
    */
   public void show() {
      LayoutParams lp = (LayoutParams)mContentView.getLayoutParams();
      lp.height = LayoutParams.WRAP_CONTENT;
      mContentView.setLayoutParams(lp);
   }
   
   private void initView(Context context) {
      mContext = context;
      LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);
      addView(moreView);
      moreView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
      
      mContentView = moreView.findViewById(R.id.xlistview_footer_content);
      mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar);
      mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview);
   }
   
   
}

XListView=================================================================

/**
 * @file XListView.java
 * @package me.maxwin.view
 * @create Mar 18, 2012 6:28:41 PM
 * @author Maxwin
 * @description An ListView support (a) Pull down to refresh, (b) Pull up to load more.
 *        Implement IXListViewListener, and see stopRefresh() / stopLoadMore().
 */
package com.daydayup.day10_zhoukao.view.custumview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.DecelerateInterpolator;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;

import com.daydayup.day10_zhoukao.R;

public class XListView extends ListView implements OnScrollListener {

   private float mLastY = -1; // save event y
   private Scroller mScroller; // used for scroll back
   private OnScrollListener mScrollListener; // user's scroll listener

   // the interface to trigger refresh and load more.
   private IXListViewListener mListViewListener;

   // -- header view
   private XListViewHeader mHeaderView;
   // header view content, use it to calculate the Header's height. And hide it
   // when disable pull refresh.
   private RelativeLayout mHeaderViewContent;
   private TextView mHeaderTimeView;
   private int mHeaderViewHeight; // header view's height
   private boolean mEnablePullRefresh = true;
   private boolean mPullRefreshing = false; // is refreashing.

   // -- footer view
   private XListViewFooter mFooterView;
   private boolean mEnablePullLoad;
   private boolean mPullLoading;
   private boolean mIsFooterReady = false;
   
   // total list items, used to detect is at the bottom of listview.
   private int mTotalItemCount;

   // for mScroller, scroll back from header or footer.
   private int mScrollBack;
   private final static int SCROLLBACK_HEADER = 0;
   private final static int SCROLLBACK_FOOTER = 1;

   private final static int SCROLL_DURATION = 400; // scroll back duration
   private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px
                                          // at bottom, trigger
                                          // load more.
   private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
                                       // feature.

   /**
    * @param context
    */
   public XListView(Context context) {
      super(context);
      initWithContext(context);
   }

   public XListView(Context context, AttributeSet attrs) {
      super(context, attrs);
      initWithContext(context);
   }

   public XListView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      initWithContext(context);
   }

   private void initWithContext(Context context) {
      mScroller = new Scroller(context, new DecelerateInterpolator());
      // XListView need the scroll event, and it will dispatch the event to
      // user's listener (as a proxy).
      super.setOnScrollListener(this);

      // init header view
      mHeaderView = new XListViewHeader(context);
      mHeaderViewContent = (RelativeLayout) mHeaderView
            .findViewById(R.id.xlistview_header_content);
      mHeaderTimeView = (TextView) mHeaderView
            .findViewById(R.id.xlistview_header_time);
      addHeaderView(mHeaderView);

      // init footer view
      mFooterView = new XListViewFooter(context);

      // init header height
      mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {
               @Override
               public void onGlobalLayout() {
                  mHeaderViewHeight = mHeaderViewContent.getHeight();
                  getViewTreeObserver()
                        .removeGlobalOnLayoutListener(this);
               }
            });
   }

   @Override
   public void setAdapter(ListAdapter adapter) {
      // make sure XListViewFooter is the last footer view, and only add once.
      if (mIsFooterReady == false) {
         mIsFooterReady = true;
         addFooterView(mFooterView);
      }
      super.setAdapter(adapter);
   }

   /**
    * enable or disable pull down refresh feature.
    * 
    * @param enable
    */
   public void setPullRefreshEnable(boolean enable) {
      mEnablePullRefresh = enable;
      if (!mEnablePullRefresh) { // disable, hide the content
         mHeaderViewContent.setVisibility(View.INVISIBLE);
      } else {
         mHeaderViewContent.setVisibility(View.VISIBLE);
      }
   }

   /**
    * enable or disable pull up load more feature.
    * 
    * @param enable
    */
   public void setPullLoadEnable(boolean enable) {
      mEnablePullLoad = enable;
      if (!mEnablePullLoad) {
         mFooterView.hide();
         mFooterView.setOnClickListener(null);
         //make sure "pull up" don't show a line in bottom when listview with one page 
         setFooterDividersEnabled(false);
      } else {
         mPullLoading = false;
         mFooterView.show();
         mFooterView.setState(XListViewFooter.STATE_NORMAL);
         //make sure "pull up" don't show a line in bottom when listview with one page  
         setFooterDividersEnabled(true);
         // both "pull up" and "click" will invoke load more.
         mFooterView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
               startLoadMore();
            }
         });
      }
   }

   /**
    * stop refresh, reset header view.
    */
   public void stopRefresh() {
      if (mPullRefreshing == true) {
         mPullRefreshing = false;
         resetHeaderHeight();
      }
   }

   /**
    * stop load more, reset footer view.
    */
   public void stopLoadMore() {
      if (mPullLoading == true) {
         mPullLoading = false;
         mFooterView.setState(XListViewFooter.STATE_NORMAL);
      }
   }

   /**
    * set last refresh time
    * 
    * @param time
    */
   public void setRefreshTime(String time) {
      mHeaderTimeView.setText(time);
   }

   private void invokeOnScrolling() {
      if (mScrollListener instanceof OnXScrollListener) {
         OnXScrollListener l = (OnXScrollListener) mScrollListener;
         l.onXScrolling(this);
      }
   }

   private void updateHeaderHeight(float delta) {
      mHeaderView.setVisiableHeight((int) delta
            + mHeaderView.getVisiableHeight());
      if (mEnablePullRefresh && !mPullRefreshing) { // 未处于刷新状态,更新箭头
         if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
            mHeaderView.setState(XListViewHeader.STATE_READY);
         } else {
            mHeaderView.setState(XListViewHeader.STATE_NORMAL);
         }
      }
      setSelection(0); // scroll to top each time
   }

   /**
    * reset header view's height.
    */
   private void resetHeaderHeight() {
      int height = mHeaderView.getVisiableHeight();
      if (height == 0) // not visible.
         return;
      // refreshing and header isn't shown fully. do nothing.
      if (mPullRefreshing && height <= mHeaderViewHeight) {
         return;
      }
      int finalHeight = 0; // default: scroll back to dismiss header.
      // is refreshing, just scroll back to show all the header.
      if (mPullRefreshing && height > mHeaderViewHeight) {
         finalHeight = mHeaderViewHeight;
      }
      mScrollBack = SCROLLBACK_HEADER;
      mScroller.startScroll(0, height, 0, finalHeight - height,
            SCROLL_DURATION);
      // trigger computeScroll
      invalidate();
   }

   private void updateFooterHeight(float delta) {
      int height = mFooterView.getBottomMargin() + (int) delta;
      if (mEnablePullLoad && !mPullLoading) {
         if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load
                                       // more.
            mFooterView.setState(XListViewFooter.STATE_READY);
         } else {
            mFooterView.setState(XListViewFooter.STATE_NORMAL);
         }
      }
      mFooterView.setBottomMargin(height);

//    setSelection(mTotalItemCount - 1); // scroll to bottom
   }

   private void resetFooterHeight() {
      int bottomMargin = mFooterView.getBottomMargin();
      if (bottomMargin > 0) {
         mScrollBack = SCROLLBACK_FOOTER;
         mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,
               SCROLL_DURATION);
         invalidate();
      }
   }

   private void startLoadMore() {
      mPullLoading = true;
      mFooterView.setState(XListViewFooter.STATE_LOADING);
      if (mListViewListener != null) {
         mListViewListener.onLoadMore();
      }
   }

   @Override
   public boolean onTouchEvent(MotionEvent ev) {
      if (mLastY == -1) {
         mLastY = ev.getRawY();
      }

      switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
         mLastY = ev.getRawY();
         break;
      case MotionEvent.ACTION_MOVE:
         final float deltaY = ev.getRawY() - mLastY;
         mLastY = ev.getRawY();
         if (getFirstVisiblePosition() == 0
               && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
            // the first item is showing, header has shown or pull down.
            updateHeaderHeight(deltaY / OFFSET_RADIO);
            invokeOnScrolling();
         } else if (getLastVisiblePosition() == mTotalItemCount - 1
               && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
            // last item, already pulled up or want to pull up.
            updateFooterHeight(-deltaY / OFFSET_RADIO);
         }
         break;
      default:
         mLastY = -1; // reset
         if (getFirstVisiblePosition() == 0) {
            // invoke refresh
            if (mEnablePullRefresh
                  && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
               mPullRefreshing = true;
               mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
               if (mListViewListener != null) {
                  mListViewListener.onRefresh();
               }
            }
            resetHeaderHeight();
         } else if (getLastVisiblePosition() == mTotalItemCount - 1) {
            // invoke load more.
            if (mEnablePullLoad
                && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA
                && !mPullLoading) {
               startLoadMore();
            }
            resetFooterHeight();
         }
         break;
      }
      return super.onTouchEvent(ev);
   }

   @Override
   public void computeScroll() {
      if (mScroller.computeScrollOffset()) {
         if (mScrollBack == SCROLLBACK_HEADER) {
            mHeaderView.setVisiableHeight(mScroller.getCurrY());
         } else {
            mFooterView.setBottomMargin(mScroller.getCurrY());
         }
         postInvalidate();
         invokeOnScrolling();
      }
      super.computeScroll();
   }

   @Override
   public void setOnScrollListener(OnScrollListener l) {
      mScrollListener = l;
   }

   @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {
      if (mScrollListener != null) {
         mScrollListener.onScrollStateChanged(view, scrollState);
      }
   }

   @Override
   public void onScroll(AbsListView view, int firstVisibleItem,
         int visibleItemCount, int totalItemCount) {
      // send to user's listener
      mTotalItemCount = totalItemCount;
      if (mScrollListener != null) {
         mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
               totalItemCount);
      }
   }

   public void setXListViewListener(IXListViewListener l) {
      mListViewListener = l;
   }

   /**
    * you can listen ListView.OnScrollListener or this one. it will invoke
    * onXScrolling when header/footer scroll back.
    */
   public interface OnXScrollListener extends OnScrollListener {
      public void onXScrolling(View view);
   }

   /**
    * implements this interface to get refresh/load more event.
    */
   public interface IXListViewListener {
      public void onRefresh();

      public void onLoadMore();
   }
}

MySearchView==============================================================

package com.daydayup.day10_zhoukao.view.custumview;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;

import com.daydayup.day10_zhoukao.R;

/**
 * 1.组合控件
 * 将原有的控件组合起来成为一个整体---控件
 * <p>
 * 1.根据需求,写布局文件
 * 2.布局文件---View
 * 3.逻辑
 * <p>
 * 2.自定义View
 * 3.自定义ViewGroup
 * <p>
 * 构造
 * onDraw
 * 绘制,文字,图片,颜色,形状
 * onMeasure
 * 测量
 * onLayout
 * 布局
 * onSizeChange
 * 当控件大小改变是调用
 * onTouchEvent
 * 处理触摸事件
 */

public class MySearchView extends LinearLayout {

    private EditText search_content;

    //1.
    //直接new的时候
    public MySearchView(Context context) {
        this(context, null);
    }

    public MySearchView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    //在布局文件里面时候控件的时候
    public MySearchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //初始化
        View view = View.inflate(context, R.layout.layout_search, this);
        search_content = view.findViewById(R.id.search_content);
//        search_content.setOnClickListener(new OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                search_content.setFocusable(true);
//            }
//        });
    }

    //获取输入的内容

    public String getContent() {
        return search_content.getText().toString();
    }

}

Presenter层===================================================================

Presnter===================================================================

package com.daydayup.day10_zhoukao.presenter;

import android.util.Log;

import com.daydayup.day10_zhoukao.http.HttpConfig;
import com.daydayup.day10_zhoukao.model.GoodsListListener;
import com.daydayup.day10_zhoukao.model.GoosListBean;
import com.daydayup.day10_zhoukao.model.IModel;
import com.daydayup.day10_zhoukao.model.LoginListener;
import com.daydayup.day10_zhoukao.model.RegListener;
import com.daydayup.day10_zhoukao.view.IGoodsListView;
import com.daydayup.day10_zhoukao.view.IMainView;
import com.daydayup.day10_zhoukao.view.IRegView;
import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by gjl on 2018/4/20.
 */

public class Presenter implements Ipresenter {
    private static final String TAG = "Presenter-----";
    //登录
    @Override
    public void loginPresenter(IModel iModel, final IMainView iMainView) {
        //调用m请求数据
        Map<String, String> map = new HashMap<>();
        map.put("mobile", iMainView.getMobile());
        map.put("password", iMainView.getPassword());
        iModel.login(HttpConfig.login_url, map, new LoginListener() {
            //根据回调结果,决定view的显示效果
            @Override
            public void loginSuccess(String json) {
                iMainView.loginSuccess();
            }

            @Override
            public void loginError(String error) {
                iMainView.loginError();
            }
        });

    }

    //注册
    @Override
    public void regPresenter(IModel iModel, final IRegView iRegView) {
        //调用m请求数据
        Map<String, String> map = new HashMap<>();
        map.put("mobile", iRegView.getMobile());
        map.put("password", iRegView.getPassword());
        iModel.reg(HttpConfig.reg_url, map, new RegListener() {
            @Override
            public void regSuccess(String json) {
                iRegView.regSuccess();
            }

            @Override
            public void regError(String error) {
                iRegView.regError();
            }
        });
    }
    //   显示数据
    @Override
    public void showGoodsListToView(IModel iModel, final IGoodsListView iGoodsListView) {
        Map<String, String> map = new HashMap<>();
        map.put("keywords", "笔记本");
        map.put("page", "1");
        iModel.getGoodsListData(HttpConfig.goods_list_url, map, new GoodsListListener() {

            @Override
            public void getDataSuccess(String json) {
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                iGoodsListView.showGoodsList(goosListBean.getData());
            }

            @Override
            public void getDataError(String error) {
                Log.d(TAG, "失败---");
            }
        });
    }

    @Override
    public void showGoodsListToViewFresh(IModel iModel, final IGoodsListView iGoodsListView) {
        Map<String, String> map = new HashMap<>();
        map.put("keywords", "笔记本");
        map.put("page", "1");
        iModel.getGoodsListData(HttpConfig.goods_list_url, map, new GoodsListListener() {

            @Override
            public void getDataSuccess(String json) {
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                iGoodsListView.showGoodsListFresh(goosListBean.getData());
            }

            @Override
            public void getDataError(String error) {
                Log.d(TAG, "失败---");
            }
        });
    }

    @Override
    public void showGoodsListToViewLoadMore(IModel iModel, final IGoodsListView iGoodsListView) {
        Map<String, String> map = new HashMap<>();
        map.put("keywords", "笔记本");
        map.put("page", iGoodsListView.getPage());
        iModel.getGoodsListData(HttpConfig.goods_list_url, map, new GoodsListListener() {

            @Override
            public void getDataSuccess(String json) {
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                iGoodsListView.showGoodsListLoadMore(goosListBean.getData());
            }

            @Override
            public void getDataError(String error) {
                Log.d(TAG, "失败---");
            }
        });
    }
//搜索
    @Override
    public void showGoodsListToViewSouSuo(IModel iModel, final IGoodsListView iGoodsListView) {
        Map<String, String> map = new HashMap<>();
        map.put("keywords", iGoodsListView.getContent());
        map.put("page", "1");
        iModel.getGoodsListData(HttpConfig.goods_list_url, map, new GoodsListListener() {

            @Override
            public void getDataSuccess(String json) {
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                iGoodsListView.showGoodsListSousuo(goosListBean.getData());
            }

            @Override
            public void getDataError(String error) {
                Log.d(TAG, "失败---");
            }
        });
    }
}

IPresenter接口======================================================

package com.daydayup.day10_zhoukao.presenter;

import com.daydayup.day10_zhoukao.model.IModel;
import com.daydayup.day10_zhoukao.view.IGoodsListView;
import com.daydayup.day10_zhoukao.view.IMainView;
import com.daydayup.day10_zhoukao.view.IRegView;

/**
 * Created by gjl on 2018/4/20.
 */

public interface Ipresenter {
    //    登录
    void loginPresenter(IModel iModel, IMainView iMainView);

    //    注册
    void regPresenter(IModel iModel, IRegView iRegView);
    //   显示数据
    void showGoodsListToView(IModel iModel, IGoodsListView iGoodsListView);
    void showGoodsListToViewFresh(IModel iModel, IGoodsListView iGoodsListView);
    void showGoodsListToViewLoadMore(IModel iModel, IGoodsListView iGoodsListView);
//    搜索
    void showGoodsListToViewSouSuo(IModel iModel, IGoodsListView iGoodsListView);
}

Modle层=====================================================================

MyAdapter===============================================================

package com.daydayup.day10_zhoukao.model;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.daydayup.day10_zhoukao.R;

import java.util.List;

/**
 * Created by gjl on 2018/4/20.
 */

public class MyAdater extends BaseAdapter {
    private Context context;
    private List<GoosListBean.DataBean> data;

    public MyAdater(Context context,List<GoosListBean.DataBean> data){
        this.context=context;
        this.data=data;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyViewHolder myViewHolder=null;
        if (convertView==null){
            convertView=View.inflate(context, R.layout.item_layout,null);

            ImageView imageView=convertView.findViewById(R.id.item_pic);
            TextView textView = convertView.findViewById(R.id.item_title);
            myViewHolder=new MyViewHolder(imageView,textView);
            convertView.setTag(myViewHolder);
        }else {
            myViewHolder= (MyViewHolder) convertView.getTag();
        }
        //赋值
        String images = data.get(position).getImages();
        String pic_url= images.split("\\|")[0];
        Glide.with(context).load(pic_url).into(myViewHolder.getImageView());
        myViewHolder.getTextView().setText(data.get(position).getTitle());

        return convertView;
    }

    class MyViewHolder{
        private ImageView imageView;
        private TextView textView;

        public MyViewHolder(ImageView imageView, TextView textView) {
            this.imageView = imageView;
            this.textView = textView;
        }

        public ImageView getImageView() {
            return imageView;
        }

        public void setImageView(ImageView imageView) {
            this.imageView = imageView;
        }

        public TextView getTextView() {
            return textView;
        }

        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    }

}

MyAdapter2=============================================================

package com.daydayup.day10_zhoukao.model;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.daydayup.day10_zhoukao.R;

import java.util.List;

/**
 * Created by gjl on 2018/4/20.
 */

public class MyAdater2 extends BaseAdapter {
    private Context context;
    private List<GoosListBean.DataBean> data;

    public MyAdater2(Context context, List<GoosListBean.DataBean> data){
        this.context=context;
        this.data=data;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MyViewHolder myViewHolder=null;
        if (convertView==null){
            convertView=View.inflate(context, R.layout.item_layout_gridview,null);

            ImageView imageView=convertView.findViewById(R.id.item_pic);
            TextView textView = convertView.findViewById(R.id.item_title);
            myViewHolder=new MyViewHolder(imageView,textView);
            convertView.setTag(myViewHolder);
        }else {
            myViewHolder= (MyViewHolder) convertView.getTag();
        }
        //赋值
        String images = data.get(position).getImages();
        String pic_url= images.split("\\|")[0];
        Glide.with(context).load(pic_url).into(myViewHolder.getImageView());
        myViewHolder.getTextView().setText(data.get(position).getTitle());

        return convertView;
    }

    class MyViewHolder{
        private ImageView imageView;
        private TextView textView;

        public MyViewHolder(ImageView imageView, TextView textView) {
            this.imageView = imageView;
            this.textView = textView;
        }

        public ImageView getImageView() {
            return imageView;
        }

        public void setImageView(ImageView imageView) {
            this.imageView = imageView;
        }

        public TextView getTextView() {
            return textView;
        }

        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    }

}

UserBean==================================================================

package com.daydayup.day10_zhoukao.model;

/**
 * 登录的Bean
 */

public class UserBean {

    /**
     * msg : 登录成功
     * code : 0
     * data : {"age":null,"appkey":"1da9c47d431c043b","appsecret":"A804850E463E7E282E09E1AD112D9808","createtime":"2018-04-20T10:38:59","email":null,"fans":null,"follow":null,"gender":null,"icon":null,"latitude":null,"longitude":null,"mobile":"18611112222","money":null,"nickname":null,"password":"8F669074CAF5513351A2DE5CC22AC04C","praiseNum":null,"token":"A4A74B21D1D9E47AA217D6CDAB9A0CE5","uid":11196,"userId":null,"username":"18611112222"}
     */

    private String msg;
    private String code;
    private 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 DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * age : null
         * appkey : 1da9c47d431c043b
         * appsecret : A804850E463E7E282E09E1AD112D9808
         * createtime : 2018-04-20T10:38:59
         * email : null
         * fans : null
         * follow : null
         * gender : null
         * icon : null
         * latitude : null
         * longitude : null
         * mobile : 18611112222
         * money : null
         * nickname : null
         * password : 8F669074CAF5513351A2DE5CC22AC04C
         * praiseNum : null
         * token : A4A74B21D1D9E47AA217D6CDAB9A0CE5
         * uid : 11196
         * userId : null
         * username : 18611112222
         */

        private Object age;
        private String appkey;
        private String appsecret;
        private String createtime;
        private Object email;
        private Object fans;
        private Object follow;
        private Object gender;
        private Object icon;
        private Object latitude;
        private Object longitude;
        private String mobile;
        private Object money;
        private Object nickname;
        private String password;
        private Object praiseNum;
        private String token;
        private int uid;
        private Object userId;
        private String username;

        public Object getAge() {
            return age;
        }

        public void setAge(Object age) {
            this.age = age;
        }

        public String getAppkey() {
            return appkey;
        }

        public void setAppkey(String appkey) {
            this.appkey = appkey;
        }

        public String getAppsecret() {
            return appsecret;
        }

        public void setAppsecret(String appsecret) {
            this.appsecret = appsecret;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        public Object getEmail() {
            return email;
        }

        public void setEmail(Object email) {
            this.email = email;
        }

        public Object getFans() {
            return fans;
        }

        public void setFans(Object fans) {
            this.fans = fans;
        }

        public Object getFollow() {
            return follow;
        }

        public void setFollow(Object follow) {
            this.follow = follow;
        }

        public Object getGender() {
            return gender;
        }

        public void setGender(Object gender) {
            this.gender = gender;
        }

        public Object getIcon() {
            return icon;
        }

        public void setIcon(Object icon) {
            this.icon = icon;
        }

        public Object getLatitude() {
            return latitude;
        }

        public void setLatitude(Object latitude) {
            this.latitude = latitude;
        }

        public Object getLongitude() {
            return longitude;
        }

        public void setLongitude(Object longitude) {
            this.longitude = longitude;
        }

        public String getMobile() {
            return mobile;
        }

        public void setMobile(String mobile) {
            this.mobile = mobile;
        }

        public Object getMoney() {
            return money;
        }

        public void setMoney(Object money) {
            this.money = money;
        }

        public Object getNickname() {
            return nickname;
        }

        public void setNickname(Object nickname) {
            this.nickname = nickname;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public Object getPraiseNum() {
            return praiseNum;
        }

        public void setPraiseNum(Object praiseNum) {
            this.praiseNum = praiseNum;
        }

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }

        public int getUid() {
            return uid;
        }

        public void setUid(int uid) {
            this.uid = uid;
        }

        public Object getUserId() {
            return userId;
        }

        public void setUserId(Object userId) {
            this.userId = userId;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }
    }
}

RegBean=======================================================

package com.daydayup.day10_zhoukao.model;

/**
 * Created by gjl on 2018/4/20.
 */

public class RegBean {

    /**
     * msg : 天呢!用户已注册
     * code : 1
     * data : {}
     */

    private String msg;
    private String code;
    private String 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 getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

RegListenter接口================================================================

package com.daydayup.day10_zhoukao.model;

/**
 * 注册的回调接口
 */

public interface RegListener {
    void regSuccess(String json);

    void regError(String error);
}

ModelImpl==============================================================

package com.daydayup.day10_zhoukao.model;

import android.util.Log;

import com.daydayup.day10_zhoukao.http.HttpUtils;
import com.daydayup.day10_zhoukao.http.OkLoadListener;
import com.google.gson.Gson;

import java.util.Map;

/**
 * Created by gjl on 2018/4/20.
 */

public class ModelImpl implements IModel {

    private static final String TAG = "ModelImpl----";

    @Override
    public void login(final String url, Map<String, String> params, final LoginListener loginListener) {
        //
        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        //调用post请求
        httpUtils.okPost(url, params);
        //        设置回调监听
        httpUtils.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {

                Log.d(TAG, "okLoadSuccess: " + json);

                //将数据传入p层
                //解析json  如果code是0,成功,否则失败
                Gson gson = new Gson();
                UserBean userBean = gson.fromJson(json, UserBean.class);
                if (userBean.getCode().equals("0")) {
                    loginListener.loginSuccess(json);
                } else {
                    loginListener.loginError(json);
                }

            }

            @Override
            public void okLoadError(String error) {
                loginListener.loginError(error);
            }
        });
    }

    //注册
    @Override
    public void reg(String url, Map<String, String> params, final RegListener regListener) {
        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        httpUtils.okPost(url, params);//调用post请求
//        设置回调监听
        httpUtils.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {

                Log.d(TAG, "okLoadSuccess: " + json);

                //将数据传入p层
                //解析json  如果code是0,成功,否则失败
                Gson gson = new Gson();
                RegBean userBean = gson.fromJson(json, RegBean.class);
                if (userBean.getCode().equals("0")) {
                    regListener.regSuccess(json);
                } else {
                    regListener.regError(json);
                }

            }

            @Override
            public void okLoadError(String error) {
                regListener.regError(error);
            }
        });
    }
    //    获取商品数据
    @Override
    public void getGoodsListData(String url, Map<String, String> params, final GoodsListListener goodsListListener) {
        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        httpUtils.okPost(url, params);//调用post请求
//        设置回调监听
        httpUtils.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {

                Log.d(TAG, "okLoadSuccess: " + json);

                //将数据传入p层
                //解析json  如果code是0,成功,否则失败
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                if (goosListBean.getCode().equals("0")) {
                    goodsListListener.getDataSuccess(json);
                } else {
                    goodsListListener.getDataError(json);
                }
            }

            @Override
            public void okLoadError(String error) {
                goodsListListener.getDataError(error);
            }
        });
    }

    @Override
    public void getGoodsListFresh(String url, Map<String, String> params, final GoodsListListener goodsListListener) {
        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        httpUtils.okPost(url, params);//调用post请求
//        设置回调监听
        httpUtils.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {

                Log.d(TAG, "okLoadSuccess: " + json);

                //将数据传入p层
                //解析json  如果code是0,成功,否则失败
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                if (goosListBean.getCode().equals("0")) {
                    goodsListListener.getDataSuccess(json);
                } else {
                    goodsListListener.getDataError(json);
                }
            }

            @Override
            public void okLoadError(String error) {
                goodsListListener.getDataError(error);
            }
        });
    }

    @Override
    public void getGoodsListLoadMore(String url, Map<String, String> params, final GoodsListListener goodsListListener) {
        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        httpUtils.okPost(url, params);//调用post请求
//        设置回调监听
        httpUtils.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {

                Log.d(TAG, "okLoadSuccess: " + json);

                //将数据传入p层
                //解析json  如果code是0,成功,否则失败
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                if (goosListBean.getCode().equals("0")) {
                    goodsListListener.getDataSuccess(json);
                } else {
                    goodsListListener.getDataError(json);
                }
            }

            @Override
            public void okLoadError(String error) {
                goodsListListener.getDataError(error);
            }
        });
    }
//    搜索
    @Override
    public void getGoodsListSouSuo(String url, Map<String, String> params, final GoodsListListener goodsListListener) {

        HttpUtils httpUtils = HttpUtils.getHttpUtils();
        httpUtils.okPost(url, params);//调用post请求
//        设置回调监听
        httpUtils.setOkLoadListener(new OkLoadListener() {
            @Override
            public void okLoadSuccess(String json) {

                Log.d(TAG, "okLoadSuccess: " + json);

                //将数据传入p层
                //解析json  如果code是0,成功,否则失败
                Gson gson = new Gson();
                GoosListBean goosListBean = gson.fromJson(json, GoosListBean.class);
                if (goosListBean.getCode().equals("0")) {
                    goodsListListener.getDataSuccess(json);
                } else {
                    goodsListListener.getDataError(json);
                }
            }

            @Override
            public void okLoadError(String error) {
                goodsListListener.getDataError(error);
            }
        });

    }
}

LoginListenter===============================================================

package com.daydayup.day10_zhoukao.model;

/**
 * Created by gjl on 2018/4/20.
 */

public interface LoginListener {
    void loginSuccess(String json);

    void loginError(String error);
}

IModel=======================================================================

package com.daydayup.day10_zhoukao.model;

import java.util.Map;

/**
 * Model
 */

public interface IModel {
    //    登录
    void login(String url, Map<String, String> params, LoginListener loginListener);

    //    注册
    void reg(String url, Map<String, String> params, RegListener regListener);

    //    获取商品数据
    void getGoodsListData(String url, Map<String, String> params, GoodsListListener goodsListListener);

    void getGoodsListFresh(String url, Map<String, String> params, GoodsListListener goodsListListener);

    void getGoodsListLoadMore(String url, Map<String, String> params, GoodsListListener goodsListListener);

    //   搜索
    void getGoodsListSouSuo(String url, Map<String, String> params, GoodsListListener goodsListListener);
}

GoodsListBean===============================================================

package com.daydayup.day10_zhoukao.model;

import java.util.List;

/**
 * 商品列表的Bean
 */

public class GoosListBean {

    /**
     * msg : 查询成功
     * code : 0
     * data : [{"bargainPrice":11800,"createtime":"2017-10-10T17:33:37","detailUrl":"https://item.m.jd.com/product/4338107.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t6700/155/2098998076/156185/6cf95035/595dd5a5Nc3a7dab5.jpg!q70.jpg","itemtype":0,"pid":57,"price":5199,"pscid":40,"salenum":4343,"sellerid":1,"subhead":"【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统","title":"小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银 "},{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/5025518.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8830/106/1760940277/195595/5cf9412f/59bf2ef5N5ab7dc16.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5428/70/1520969931/274676/b644dd0d/591128e7Nd2f70da0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5566/365/1519564203/36911/620c750c/591128eaN54ac3363.jpg!q70.jpg","itemtype":1,"pid":58,"price":6399,"pscid":40,"salenum":545,"sellerid":2,"subhead":"升级4G大显存!Nvme协议Pcie SSD,速度快人一步】GTX1050Ti就选拯救者!专业游戏键盘&新模具全新设计!","title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 1T+128G SSD GTX1050Ti 4G IPS 黑)"},{"bargainPrice":5599,"createtime":"2017-10-10T17:30:32","detailUrl":"https://item.m.jd.com/product/4824715.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n12/jfs/t7768/184/1153704394/148460/f42e1432/599a930fN8a85626b.jpg!q70.jpg","itemtype":0,"pid":59,"price":5599,"pscid":40,"salenum":675,"sellerid":3,"subhead":"游戏本选择4G独显,拒绝掉帧】升级版IPS全高清防眩光显示屏,WASD方向键颜色加持,三大出风口立体散热!","title":"戴尔DELL灵越游匣15PR-6648B GTX1050 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 128GSSD+1T 4G独显 IPS)黑"},{"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":60,"price":13888,"pscid":40,"salenum":466,"sellerid":4,"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":61,"price":14999,"pscid":40,"salenum":5535,"sellerid":5,"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":62,"price":15999,"pscid":40,"salenum":43,"sellerid":6,"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":63,"price":10000,"pscid":40,"salenum":3232,"sellerid":7,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"},{"bargainPrice":11800,"createtime":"2017-10-03T23:43:53","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":64,"price":11000,"pscid":40,"salenum":0,"sellerid":8,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"},{"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":65,"price":12000,"pscid":40,"salenum":868,"sellerid":9,"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":66,"price":13000,"pscid":40,"salenum":7676,"sellerid":10,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}]
     * 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 : 11800
         * createtime : 2017-10-10T17:33:37
         * detailUrl : https://item.m.jd.com/product/4338107.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends
         * images : https://m.360buyimg.com/n0/jfs/t6700/155/2098998076/156185/6cf95035/595dd5a5Nc3a7dab5.jpg!q70.jpg
         * itemtype : 0
         * pid : 57
         * price : 5199
         * pscid : 40
         * salenum : 4343
         * sellerid : 1
         * subhead : 【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统
         * title : 小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银
         */

        private int 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 int getBargainPrice() {
            return bargainPrice;
        }

        public void setBargainPrice(int 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;
        }
    }
}

GoodsListenter接口==============================================================

package com.daydayup.day10_zhoukao.model;

/**
 * 注册的回调接口
 */

public interface GoodsListListener {
    //    获取数据成功
    void getDataSuccess(String json);

    //获取数据失败
    void getDataError(String error);
}

Http层=======================================================================

HttpConfig==============================================================

package com.daydayup.day10_zhoukao.http;

/**
 * 接口类
 * 用于存放接口
 */

public class HttpConfig {
    //登录接口
    public static String login_url = "http://120.27.23.105/user/login";
    //    注册
    public static String reg_url = "http://120.27.23.105/user/reg";
    //    商品列表接口
    public static String goods_list_url = "http://120.27.23.105/product/searchProducts";
}

HttpUtiels==============================================================

package com.daydayup.day10_zhoukao.http;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Set;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * HttpUtils工具类
 * 封装ok  post 拦截器添加公共参数
 */

public class HttpUtils {
    private static final String TAG = "HttpUtils-----";
    private static HttpUtils httpUtils;
    private final int SUCCESS = 0;
    private final int ERROR = 1;
    private MyHandler myHandler = new MyHandler();
    private OkLoadListener okLoadListener;

    public static HttpUtils getHttpUtils() {
        if (httpUtils == null) {
            httpUtils = new HttpUtils();
        }
        return httpUtils;
    }

    //Handler处理线程
    class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SUCCESS:
                    //成功
                    String json = (String) msg.obj;
                    okLoadListener.okLoadSuccess(json);
                    break;

                case ERROR:
                    //失败
                    String error = (String) msg.obj;
                    okLoadListener.okLoadError(error);
                    break;
            }
        }
    }

    //get
    public void okGet(String url) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new MyIntercepter()).build();

        Request request = new Request.Builder().url(url).build();
        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message = myHandler.obtainMessage();
                message.what = ERROR;
                message.obj = e.getMessage();
                myHandler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Message message = myHandler.obtainMessage();
                message.what = SUCCESS;
                message.obj = response.body().string();
                myHandler.sendMessage(message);
            }
        });
    }

    public void setOkLoadListener(OkLoadListener okLoadListener) {
        this.okLoadListener = okLoadListener;
    }

    //post
    public void okPost(String url, Map<String, String> params) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new MyIntercepter()).build();

        FormBody.Builder builder = new FormBody.Builder();
        Set<String> keySet = params.keySet();
        for (String key :
                keySet) {
            String value = params.get(key);
            builder.add(key, value);
        }
        FormBody formBody = builder.build();
        Request request = new Request.Builder().url(url).post(formBody).build();
        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message = myHandler.obtainMessage();
                message.what = ERROR;
                message.obj = e.getMessage();
                myHandler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Message message = myHandler.obtainMessage();
                message.what = SUCCESS;
                message.obj = response.body().string();
                myHandler.sendMessage(message);
            }
        });

    }

    //拦截器
    class MyIntercepter implements Interceptor {
        //intercept 拦截
        @Override
        public Response intercept(Chain chain) throws IOException {
            //添加公共参数
            //post 取出原来所有的参数,将之加到新的请求体里面。然后让请求去执行
            Request request = chain.request();
            //获取请求方法
            String method = request.method();
            if (method.equals("GET")) {//---------------------------GET 拦截
                //取出url地址
                String url = request.url().toString();
                //拼接公共参数
                boolean contains = url.contains("?");
                if (contains) {
                    url = url + "&source=android";
                } else {
                    url = url + "?source=android";
                }

                Request request1 = request.newBuilder().url(url).build();

                Response response = chain.proceed(request1);

                return response;


            } else if (method.equals("POST")) {//---------------------POST 拦截
                RequestBody body = request.body();//请求体
                if (body instanceof FormBody) {
                    //创建新的请求体
                    FormBody.Builder newBuilder = new FormBody.Builder();
                    for (int i = 0; i < ((FormBody) body).size(); i++) {
                        String key = ((FormBody) body).name(i);
                        String value = ((FormBody) body).value(i);
                        newBuilder.add(key, value);
                    }
                    //添加公共参数
                    newBuilder.add("source", "android");
                    FormBody newBody = newBuilder.build();
                    //创建新的请求体
                    Request request1 = request.newBuilder().post(newBody).build();
                    //去请求
                    Response response = chain.proceed(request1);
                    return response;
                }
            }
            return null;
        }
    }

    //上传文件(图片)
    public void upLoadImage(String url, String path) {//url 要上传的地址。path 要上传的文件路径
        //媒体类型
        MediaType mediaType = MediaType.parse("image/*");
        //multipartbody
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        File file = new File(path);
        MultipartBody multipartBody = builder.addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file)).build();

        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url(url).post(multipartBody).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "上传失败0----: ");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, "上传成功: ");
            }
        });

    }
}

OkLoadListenter接口============================================================

package com.daydayup.day10_zhoukao.http;

/**
 * OkHttp网络请求的监听
 */

public interface OkLoadListener {
    //    请求数据成功
    void okLoadSuccess(String json);

    //请求数据失败
    void okLoadError(String error);
}

权限=======================================================================

<uses-permission android:name="android.permission.INTERNET" />


<activity android:name=".view.GoodsListActivity" />
<activity android:name=".view.RegActivity" />
<activity android:name=".view.DeatilActivity"></activity>

依赖====================================================================

compile 'com.google.code.gson:gson:2.6.2'

compile 'com.squareup.okhttp3:okhttp:3.3.0'

compile 'com.github.bumptech.glide:glide:3.7.0'

猜你喜欢

转载自blog.csdn.net/nijiadalinge/article/details/80159420