Model
LoginModel
public class LoginModel {
private IPresenterLogin iPresenterLogin;
public LoginModel(IPresenterLogin iPresenterLogin) {
this.iPresenterLogin = iPresenterLogin;
}
public void getData(String loginUrl, String umobile, String upwd) {
Map<String, String> map = new HashMap<>();
map.put("mobile",umobile);
map.put("password",upwd);
OkHttp3Util.doPost(loginUrl, map, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
iPresenterLogin.onFailed(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
String json = response.body().string();
if(json!=null){
//使用原生解析
try {
JSONObject obj = new JSONObject(json);
//使用接口回调
iPresenterLogin.onSuccess(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
}
}
RegModel
public class RegistModel {
private IPresenterRegist iPresenterRegist;
public RegistModel(RegistPresenter iPresenterRegist) {
this.iPresenterRegist = iPresenterRegist;
}
public void getData(String loginUrl, String umobile, String upwd) {
Map<String, String> map = new HashMap<>();
map.put("mobile",umobile);
map.put("password",upwd);
OkHttp3Util.doPost(loginUrl, map, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
iPresenterRegist.onFailed(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
String json = response.body().string();
if(json!=null){
//使用原生解析
try {
JSONObject obj = new JSONObject(json);
//使用接口回调
iPresenterRegist.onSuccess(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
}
}
SearchModel
public class SearchModel {
private IPresenterSearch iPresenterSearch;
public SearchModel(IPresenterSearch iPresenterSearch) {
this.iPresenterSearch = iPresenterSearch;
}
public SearchModel(SearchPresenter searchPresenter) {
}
public void getData(String loginUrl, String keywords) {
Map<String, String> map = new HashMap<>();
Log.d("++++++++++++++",loginUrl);
map.put("keywords",keywords);
map.put("page","1");
map.put("source","android");
OkHttp3Util.doGet(loginUrl+"?keywords="+keywords+"&page="+1+"&source="+"android", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
String json = response.body().string();
if(json!=null){
//使用原生解析
try {
Gson gson = new Gson();
AllContent allContent = gson.fromJson(json, AllContent.class);
//使用接口回调
iPresenterSearch.onSuccess(allContent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
}
}
Preserten
IPresenterLogin
public interface IPresenterLogin {
void onSuccess(JSONObject obj);
void onFailed(String error);
}
IPresenterRegist
public interface IPresenterRegist {
void onSuccess(JSONObject obj);
void onFailed(String error);
}
IPresenterSearch
public interface IPresenterSearch {
void onSuccess(AllContent allContent);
}
LoginPresenter
public class LoginPresenter implements IPresenterLogin{
private IViewLogin iViewLogin;
private final LoginModel regModel;
public LoginPresenter(MainActivity iViewLogin) {
this.iViewLogin = (IViewLogin) iViewLogin;
regModel = new LoginModel(this);
}
public void getData(String loginUrl, String umobile, String upwd) {
regModel.getData(loginUrl,umobile,upwd);
}
@Override
public void onSuccess(JSONObject obj) {
iViewLogin.onSuccess(obj);
}
@Override
public void onFailed(String error) {
iViewLogin.onFailed(error);
}
}
RegistPresenter
public class RegistPresenter implements IPresenterRegist{
private IViewRegist iViewRegist;
private final RegistModel registModel;
public RegistPresenter(RegActivity iViewRegist) {
this.iViewRegist = iViewRegist;
registModel = new RegistModel(this);
}
public void getData(String loginUrl, String umobile, String upwd) {
registModel.getData(loginUrl,umobile,upwd);
}
@Override
public void onSuccess(JSONObject obj) {
iViewRegist.onSuccess(obj);
}
@Override
public void onFailed(String error) {
iViewRegist.onFailed(error);
}
}
SearchPresenter
public abstract class SearchPresenter implements IPresenterSearch{
SearchModel searchModel = new SearchModel(this);
private IViewSearch iViewSearch;
public SearchPresenter(SearchActivity iViewSearch) {
this.iViewSearch = (IViewSearch) iViewSearch;
}
public void getData(String searchUrl, String keywords) {
searchModel.getData(searchUrl,keywords);
}
public void onSuccess(AllContent allContent) {
iViewSearch.onSuccess(allContent);
}
}
ApiUtil
public class ApiUtil {
public static final String LOGIN_URL = "https://www.zhaoapi.cn/user/login";
public static final String REGIST_URL = "https://www.zhaoapi.cn/user/reg";
public static final String SEARCH_URL = "http://120.27.23.105/product/searchProducts";
}
Activity
LoginActivity
public class MainActivity extends AppCompatActivity {
private TextView login_umobile;
private TextView login_upwd;
private JSONObject data;
private LoginPresenter regPresenter;
private String umobile;
private String upwd;
private SharedPreferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
login_umobile = (TextView) findViewById(R.id.login_umobile);
login_upwd = (TextView) findViewById(R.id.login_upwd);
//创建中间者
regPresenter = new LoginPresenter(this);
//存储数据的对象
preferences = getSharedPreferences("logindata", MODE_PRIVATE);
boolean islogin = preferences.getBoolean("islogin", false);
if(islogin){
Intent intent = new Intent(MainActivity.this,SearchActivity.class);
startActivity(intent);
}
}
public void regist(View view) {
Intent intent = new Intent(MainActivity.this,RegActivity.class);
startActivity(intent);
}
//登录
public void login(View view) {
umobile = login_umobile.getText().toString();
upwd = login_upwd.getText().toString();
regPresenter.getData(ApiUtil.LOGIN_URL, umobile, upwd);
}
public void onSuccess(final JSONObject obj){
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
String code = obj.getString("code");
if("0".equals(code)){
//登录成功后,将数据存入SharedPreferences
SharedPreferences.Editor edit = preferences.edit();
edit.putString("mobile",umobile);
edit.putString("password",upwd);
edit.putBoolean("islogin",true);
edit.commit();
Intent intent = new Intent(MainActivity.this,SearchActivity.class);
startActivity(intent);
Toast.makeText(MainActivity.this,obj.getString("msg"), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,obj.getString("msg"), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void onFailed(String error) {
Log.d("MainActivity请求失败原因",error);
}
}
RegActivity
public class RegActivity extends AppCompatActivity implements IViewRegist {
private TextView reg_upwd;
private TextView reg_umobile;
private String umobile;
private String upwd;
private RegistPresenter registPresenter;
private TextView fan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reg);
reg_umobile = (TextView) findViewById(R.id.reg_umobile);
reg_upwd = (TextView) findViewById(R.id.reg_upwd);
fan = (TextView) findViewById(R.id.fan);
registPresenter = new RegistPresenter(this);
//点击返回
fan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
//立即注册
public void goRegist(View view) {
umobile = reg_umobile.getText().toString();
upwd = reg_upwd.getText().toString();
registPresenter.getData(ApiUtil.REGIST_URL,umobile,upwd);
}
@Override
public void onSuccess(final JSONObject obj) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
String code = obj.getString("code");
if("0".equals(code)){
Toast.makeText(RegActivity.this,obj.getString("msg"), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(RegActivity.this,obj.getString("msg"), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
public void onFailed(String error) {
Log.d("RegActivity请求失败原因",error);
}
}
SearchActivity
public class SearchActivity extends AppCompatActivity implements IViewSearch{
private EditText shu;
private RecyclerView recycler_view;
private SearchPresenter searchPresenter;
private CheckBox ck;
boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
shu = (EditText) findViewById(R.id.shu);
recycler_view = (RecyclerView) findViewById(R.id.recycler_view);
ck = (CheckBox) findViewById(R.id.ck);
searchPresenter = new SearchPresenter(this);
}
//搜索
public void search(View view) {
try {
String name = shu.getText().toString();
String keywords = URLEncoder.encode(name, "utf-8");
searchPresenter.getData(ApiUtil.SEARCH_URL,keywords);
} catch (Exception e) {
e.printStackTrace();
}
}
//切换布局(网格---列表)
@Override
public void onSuccess(final AllContent allContent) {
runOnUiThread(new Runnable() {
@Override
public void run() {
final List<AllContent.DataBean> data = allContent.getData();
Toast.makeText(SearchActivity.this, allContent.getMsg(),Toast.LENGTH_SHORT).show();
//设置适配器
/*SearchRecyclerAdapter adapter = new SearchRecyclerAdapter(SearchActivity.this,data);
recycler_view.setAdapter(adapter);
recycler_view.setLayoutManager(new LinearLayoutManager(SearchActivity.this, LinearLayout.VERTICAL,false));*/
setAdapter(data);
ck.setChecked(flag);
ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(flag){
//设置管理器、适配器
setAdapter(data);
ck.setChecked(false);
flag = ck.isChecked();
}else{
SearchRecyclerGVAdapter gvAdapter = new SearchRecyclerGVAdapter(SearchActivity.this, data);
recycler_view.setAdapter(gvAdapter);
recycler_view.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
ck.setChecked(true);
flag = ck.isChecked();
}
}
});
}
});
}
private void setAdapter(List<AllContent.DataBean> data) {
SearchRecyclerAdapter adapter = new SearchRecyclerAdapter(SearchActivity.this,data);
recycler_view.setAdapter(adapter);
recycler_view.setLayoutManager(new LinearLayoutManager(SearchActivity.this, LinearLayout.VERTICAL,false));
}
}
SearchRecyclerHolder
public class SearchRecyclerHolder extends RecyclerView.ViewHolder {
public ImageView img;
public TextView title;
public TextView price;
public SearchRecyclerHolder(View itemView) {
super(itemView);
img = (ImageView) itemView.findViewById(R.id.img);
price = (TextView) itemView.findViewById(R.id.price);
title = (TextView) itemView.findViewById(R.id.title);
}
}
Interfac
IViewLogin
public interface IViewLogin {
void onSuccess(JSONObject obj);
void onFailed(String error);
}
IViewRegist
public interface IViewRegist {
void onSuccess(JSONObject obj);
void onFailed(String error);
}
IViewSearch
public interface IViewSearch {
void onSuccess(AllContent allContent);
}
Adapter
SearchRecyclerAdapter
public class SearchRecyclerAdapter extends RecyclerView.Adapter<SearchRecyclerHolder> {
Context context;
List<AllContent.DataBean> data;
public SearchRecyclerAdapter(Context context, List<AllContent.DataBean> data) {
this.context = context;
this.data = data;
}
@Override
public SearchRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
SearchRecyclerHolder searchRecyclerHolder = new SearchRecyclerHolder(view);
return searchRecyclerHolder;
}
@Override
public void onBindViewHolder(SearchRecyclerHolder holder, int position) {
AllContent.DataBean dataBean = data.get(position);
String images = dataBean.getImages();
String[] split = images.split("\\|");
//设置数据
Glide.with(context).load(split[0]).into(holder.img);
holder.price.setText(dataBean.getPrice()+"");
holder.title.setText(dataBean.getTitle());
}
@Override
public int getItemCount() {
return data.size();
}
}
SearchRecyclerGVAdapter
public class SearchRecyclerGVAdapter extends RecyclerView.Adapter<SearchRecyclerHolder> {
Context context;
List<AllContent.DataBean> data;
public SearchRecyclerGVAdapter(Context context, List<AllContent.DataBean> data) {
this.context = context;
this.data = data;
}
@Override
public SearchRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
SearchRecyclerHolder searchRecyclerHolder = new SearchRecyclerHolder(view);
return searchRecyclerHolder;
}
@Override
public void onBindViewHolder(SearchRecyclerHolder holder, int position) {
AllContent.DataBean dataBean = data.get(position);
String images = dataBean.getImages();
String[] split = images.split("\\|");
//设置数据
Glide.with(context).load(split[0]).into(holder.img);
holder.price.setText(dataBean.getPrice()+"");
holder.title.setText(dataBean.getTitle());
}
@Override
public int getItemCount() {
return data.size();
}
}
布局文件
Login
<TextView
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="登录"
android:textSize="35dp"
android:gravity="center"/>
<TextView
android:background="#f1ebeb"
android:layout_width="match_parent"
android:layout_height="5dp"/>
<EditText
android:id="@+id/login_umobile"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="请输入手机号"
android:layout_marginTop="50dp"
android:layout_marginBottom="30dp"/>
<EditText
android:id="@+id/login_upwd"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="请输入密码"
android:layout_marginBottom="30dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="30dp">
<Button
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="登录"
android:onClick="login"/>
<Button
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="注册"
android:onClick="regist"/>
</LinearLayout>
Reg
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp">
<TextView
android:id="@+id/fan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<"
android:textSize="35dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="登录"
android:textSize="35dp"
android:gravity="center"/>
</RelativeLayout>
<TextView
android:background="#f1ebeb"
android:layout_width="match_parent"
android:layout_height="5dp"/>
<EditText
android:id="@+id/reg_umobile"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="请输入手机号"
android:layout_marginTop="50dp"
android:layout_marginBottom="30dp"/>
<EditText
android:id="@+id/reg_upwd"
android:layout_width="320dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="请输入密码"
android:layout_marginBottom="30dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="立即注册"
android:textSize="25dp"
android:textColor="#89f"
android:onClick="goRegist"
android:layout_gravity="center"/>
Search
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:padding="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索商品"
android:textSize="35dp"
android:layout_centerInParent="true"/>
<CheckBox
android:button="@null"
android:layout_width="30dp"
android:layout_height="30dp"
android:id="@+id/ck"
android:background="@drawable/myselect"
android:layout_alignParentRight="true" />
</RelativeLayout>
<TextView
android:background="#f1ebeb"
android:layout_width="match_parent"
android:layout_height="3dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:orientation="horizontal">
<EditText
android:id="@+id/shu"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:hint="请输入关键字"
android:layout_marginLeft="50dp"/>
<Button
android:onClick="search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索"
android:layout_alignRight="@id/shu"/>
</LinearLayout>
<TextView
android:background="#f1ebeb"
android:layout_width="match_parent"
android:layout_height="3dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
搜索切换布局
Grid_item
<ImageView
android:id="@+id/img"
android:layout_width="180dp"
android:layout_height="180dp"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="bbbbbbbbb"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<TextView
android:id="@+id/price"
android:text="aaaaa"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
list_item
<ImageView
android:id="@+id/img"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="bbbbbbbbb"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<TextView
android:id="@+id/price"
android:text="aaaaa"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
添加依赖
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.orhanobut:logger:2.1.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:recyclerview-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.google.code.gson:gson:2.8.2'