布局============================================================
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'