接口MVP原生登录注册+搜索+recycleView切换展示


依赖


    compile 'com.squareup.okhttp3:okhttp:3.9.1'compile 'com.google.code.gson:gson:2.8.2'compile 'com.android.support:design:26.+'compile 'com.jcodecraeer:xrecyclerview:1.5.2'compile 'com.github.bumptech.glide:glide:3.7.0'

权限

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

model包


LoginModel

    import android.os.Handler;import com.bwie.week2test.Contents;import com.bwie.week2test.presenter.ILoginPresenter;import java.io.IOException;import java.util.HashMap;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class LoginModel implements ILoginModel{private static Handler handler=new Handler();@Overridepublic void login(String mobile, String password, final ILoginPresenter iLoginPresenter) {String url=Contents.LOGIN+"?mobile="+mobile+"&password="+password;OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().get().url(url).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, final IOException e) {handler.post(new Runnable() {@Overridepublic void run() {iLoginPresenter.onFailed(e.getMessage());}});}@Overridepublic void onResponse(Call call, Response response) throws IOException {if(response.isSuccessful()){final String result = response.body().string();handler.post(new Runnable() {@Overridepublic void run() {iLoginPresenter.onSuccess(result);}});}}});}}

ILoginModel接口

public interface ILoginModel {void login(String mobile, String password, ILoginPresenter iLoginPresenter);}

RegisterModel


public class RegisterModel implements IRegisterModel {private static Handler handler=new Handler();@Overridepublic void register(String mobile, String password, final IRegisterPresenter iRegisterPresenter) {String url= Contents.REGISTER+"?mobile="+mobile+"&password="+password;OkHttpClient okHttpClient=new OkHttpClient();Request request=new Request.Builder().get().url(url).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, final IOException e) {handler.post(new Runnable() {@Overridepublic void run() {iRegisterPresenter.onFailed(e.getMessage());}});}@Overridepublic void onResponse(Call call, Response response) throws IOException {if(response.isSuccessful()){final String result = response.body().string();handler.post(new Runnable() {@Overridepublic void run() {iRegisterPresenter.onSuccess(result);}});}}});}
}

接口IRegisterModel

public interface IRegisterModel {void register(String mobile, String password, IRegisterPresenter iRegisterPresenter);
}

presenter包


ILoginPresenter

public interface ILoginPresenter {void login(String mobile,String password);void onFailed(String msg);void onSuccess(Object o);void onDestory();
}

LoginPresenter


public class LoginPresenter implements ILoginPresenter {private ILoginView iLoginView;private final LoginModel loginModel;public LoginPresenter(ILoginView iLoginView) {this.iLoginView = iLoginView;loginModel = new LoginModel();}@Overridepublic void login(String mobile, String password) {loginModel.login(mobile,password,this);}@Overridepublic void onFailed(String msg) {if(null==iLoginView){return;}iLoginView.onFailed(msg);}@Overridepublic void onSuccess(Object o) {if(null==iLoginView){return;}Gson gson=new Gson();LoginBean loginBean = gson.fromJson(o.toString(), LoginBean.class);String code = loginBean.getCode();if("0".equals(code)){iLoginView.onSuccess(loginBean.getMsg());}else{iLoginView.onFailed(loginBean.getMsg());}}@Overridepublic void onDestory() {if(null!=iLoginView){iLoginView=null;}}
}

接口IRegisterPresenter

public interface IRegisterPresenter {void register(String mobile,String password);void onFailed(String msg);void onSuccess(Object o);void onDestory();
}

RegisterPresenter

public class RegisterPresenter implements IRegisterPresenter{private IRegisterView iRegisterView;private final RegisterModel registerModel;public RegisterPresenter(IRegisterView iRegisterView) {this.iRegisterView = iRegisterView;registerModel = new RegisterModel();}@Overridepublic void register(String mobile, String password) {registerModel.register(mobile,password,this);}@Overridepublic void onFailed(String msg) {if(null==iRegisterView){return;}iRegisterView.onFailed(msg);}@Overridepublic void onSuccess(Object o) {if(null==iRegisterView){return;}Gson gson=new Gson();RegisterBean registerBean = gson.fromJson(o.toString(), RegisterBean.class);String code = registerBean.getCode();if("0".equals(code)){iRegisterView.onSuccess(registerBean.getMsg());}else{iRegisterView.onFailed(registerBean.getMsg());}}@Overridepublic void onDestory() {if(null!=iRegisterView){iRegisterView=null;}}
}

view包


接口ILoginView

public interface ILoginView {void onFailed(String msg);void onSuccess(Object o);
}

LoginActivity

public class LoginActivity extends AppCompatActivity implements ILoginView{private LoginPresenter loginPresenter;private EditText tel;private EditText pwd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);tel = (EditText) findViewById(R.id.mobile);pwd = (EditText) findViewById(R.id.password);loginPresenter = new LoginPresenter(this);}public void btnLogin(View view){String mobile = tel.getText().toString();String password = pwd.getText().toString();loginPresenter.login(mobile,password);}public void btnRegister(View view){Intent intent=new Intent(this,RegisterActivity.class);startActivity(intent);}@Overridepublic void onFailed(String msg) {Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();if("天呢!用户不存在".equals(msg)){Intent intent=new Intent(this,RegisterActivity.class);startActivity(intent);}}@Overridepublic void onSuccess(Object o) {Toast.makeText(this, o.toString(), Toast.LENGTH_SHORT).show();Intent intent=new Intent(this,SearchActivity.class);startActivity(intent);finish();}@Overrideprotected void onDestroy() {super.onDestroy();loginPresenter.onDestory();}
}

接口IRegisterView

public interface IRegisterView {void onFailed(String msg);void onSuccess(Object o);
}

RegisterActivity

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;import com.bwie.week2test.R;
import com.bwie.week2test.presenter.RegisterPresenter;public class RegisterActivity extends AppCompatActivity implements IRegisterView{private static RegisterPresenter registerPresenter;private EditText regTel;private EditText regPwd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_register);regTel = (EditText) findViewById(R.id.regTel);regPwd = (EditText) findViewById(R.id.regPwd);registerPresenter=new RegisterPresenter(this);}public void regNow(View view){String mobile = regTel.getText().toString();String password = regPwd.getText().toString();registerPresenter.register(mobile,password);}//返回按钮public void back(View view){finish();}@Overridepublic void onFailed(String msg) {Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();}@Overridepublic void onSuccess(Object o) {Toast.makeText(this, o.toString(), Toast.LENGTH_SHORT).show();Intent intent=new Intent(this,LoginActivity.class);startActivity(intent);finish();}@Overrideprotected void onDestroy() {super.onDestroy();registerPresenter.onDestory();}
}

SearchActivity

public class SearchActivity extends AppCompatActivity implements View.OnClickListener{private ImageView mIvKindBack;/*** 请输入查找*/private EditText mTextView;/*** 搜索*/private TextView mSearchTxt;private RecyclerView mRvyHot;private ListView mRcyHistory;/*** 清空历史搜索*/private Button mClearBtn;private SQLiteDatabase db;private String name;private DataBaseBean dataBaseBean;private List<DataBaseBean> dataList = new ArrayList<>();private HisetroyAdapter adapter;private List<String> goodslist = new ArrayList<>();private String searchName;private List<String> stringList = new ArrayList<String>(){{add("应急启动电源");add("餐桌");add("粽子散装");add("智能手表");add("摩托车挂饰");add("三只松鼠");add("华为");add("金士顿U盘");add("苹果X");add("三星耳机");add("锤子手机");add("伊利牛奶");add("苹果笔记本");add("按摩椅");add("六个核桃");add("公牛插座");add("跑步机");add("真皮钱包");add("海澜之家");add("阿玛尼");add("阿迪达斯");}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_search);initView();DatabaseHelper helper = new DatabaseHelper(this);db = helper.getWritableDatabase();adapter = new HisetroyAdapter(this,goodslist);HotAdapter hotAdapter = new HotAdapter(this , stringList);LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);mRvyHot.setLayoutManager(manager);mRvyHot.setAdapter(hotAdapter);}private void initView() {mIvKindBack = (ImageView) findViewById(R.id.iv_kind_back);mTextView = (EditText) findViewById(R.id.textView);mSearchTxt = (TextView) findViewById(R.id.search_txt);mRvyHot = (RecyclerView) findViewById(R.id.rvy_hot);mRcyHistory = (ListView) findViewById(R.id.rcy_history);mClearBtn = (Button) findViewById(R.id.clear_btn);mClearBtn.setOnClickListener(this);mSearchTxt.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {default:break;case R.id.clear_btn:String deleSql="delete from person";db.execSQL(deleSql);goodslist.clear();adapter.notifyDataSetChanged();break;case R.id.search_txt:name = mTextView.getText().toString().trim();db.execSQL("insert into person(name) values(?)",new Object[]{name});mTextView.setText("");Intent intent = new Intent(SearchActivity.this,GoodsActivity.class);intent.putExtra("data",name);startActivity(intent);break;}}@Overrideprotected void onResume() {super.onResume();Log.e("zxz", "我又来了 " );Cursor cursor = db.rawQuery("select *from person", null);while (cursor.moveToNext()) {//获取第一列的值,第一列的索引从0开始int id = cursor.getInt(0);//获取第二列的值searchName = cursor.getString(1);Log.e("zxz", "我是shujuk:"+name + id );}goodslist.add(searchName);mRcyHistory.setAdapter(adapter);adapter.notifyDataSetChanged();}}

Utils包


GsonUtils

public class GsonUtils {private static Gson instance;private GsonUtils() {}public static Gson getInstance() {if (instance == null) {instance = new Gson();}return instance;}
}

SearchUtils

public class SearchUtils {private  static  volatile SearchUtils instance;private SearchUtils(){}private Handler handler = new Handler();public static SearchUtils getInstance(){if(instance==null){synchronized (SearchUtils.class){if(null==instance){instance= new SearchUtils();}}}return instance;}public  void post(String url, Map<String,String> map , final SearchCallback callBack, final Class cls){OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new MyInterceptor()).build();FormBody.Builder builder = new FormBody.Builder();for (Map.Entry<String, String> entry : map.entrySet()) {builder.add(entry.getKey(), entry.getValue());}FormBody body = builder.build();final Request request = new Request.Builder().url(url).post(body).build();Call call = client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, final IOException e) {handler.post(new Runnable() {@Overridepublic void run() {callBack.onFailed(e);}});}@Overridepublic void onResponse(final Call call, Response response) throws IOException {final String data = response.body().string().trim();handler.post(new Runnable() {@Overridepublic void run() {if(data!=null){Object o = GsonUtils.getInstance().fromJson(data, SearchBean.class);if(o!=null){callBack.onSuccess(o);}}}});}});}
}

adapter包


HisetroyAdapter

public class HisetroyAdapter extends BaseAdapter {private Context context;private List<String> list;public HisetroyAdapter(Context context, List<String> list) {this.context=context;this.list=list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int i) {return list.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder holder = null;if(view==null){holder = new ViewHolder();view = View.inflate(context, R.layout.history_layout,null);holder.historyName = view.findViewById(R.id.history_name);view.setTag(holder);}else{holder = (ViewHolder) view.getTag();}if(list!=null){holder.historyName.setText(list.get(i));}return view;}class ViewHolder{TextView historyName;}
}

HotAdapter

public class HotAdapter extends RecyclerView.Adapter<HotAdapter.ViewHolder> {private Context con;private List<String> list;private int i ;public HotAdapter(Context con, List<String> list) {this.con = con;this.list = list;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v = View.inflate(con, R.layout.item, null);ViewHolder holder = new ViewHolder(v);return holder;}@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) {holder.tv_name.setText(list.get(position));}@Overridepublic int getItemCount() {return list.size();}class ViewHolder extends XRecyclerView.ViewHolder{private TextView tv_name;public ViewHolder(View itemView) {super(itemView);tv_name = itemView.findViewById(R.id.tv_name);}}
}

SearchAdapter

public class SearchAdapter extends XRecyclerView.Adapter<SearchAdapter.ViewHolder> {private Context con;private List<SearchBean.DataBean> list;private int i ;public SearchAdapter(Context con, List<SearchBean.DataBean> list,int i) {this.con = con;this.list = list;this.i=i;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//        View view = View.inflate(con, R.layout.sublist_item, null);
//        ViewHolder holder = new ViewHolder(view);
//
//        return holder;if (i==1){View v = View.inflate(con, R.layout.sublist_item, null);ViewHolder holder = new ViewHolder(v);return holder;}else if (i==2){View v = View.inflate(con, R.layout.sublist_item2, null);ViewHolder holder = new ViewHolder(v);return holder;}return null;}@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) {holder.tvTitle.setText(list.get(position).getTitle());holder.price.setText("¥"+list.get(position).getPrice());
//        holder.num.setText("销量:"+list.get(position).getSalenum());String images = list.get(position).getImages();String[] split = images.split("\\|");Glide.with(con).load(split[0]).into(holder.img);int pid = list.get(position).getPid();//        holder.itemView.setOnClickListener(new View.OnClickListener() {//            @Override
//            public void onClick(View view) {//                Intent intent = new Intent(con, DetailActivity.class);
//                intent.putExtra("pid",list.get(position).getPid()+"");
//                con.startActivity(intent);
//            }
//        });}@Overridepublic int getItemCount() {return list.size();}class ViewHolder extends XRecyclerView.ViewHolder{private TextView tvTitle;private TextView price;private ImageView img;private TextView num;public ViewHolder(View itemView) {super(itemView);tvTitle = itemView.findViewById(R.id.sublist_title);price = itemView.findViewById(R.id.sublist_price);num = itemView.findViewById(R.id.sublist_num);img = itemView.findViewById(R.id.sublist_img);}}
}

callback


接口SearchCallback

public interface SearchCallback {void onSuccess(Object o);void onFailed(Exception e);
}

接口SearchIView

public interface SearchIView {void onSuccess(List<SearchBean.DataBean> data);
}

bean包


DataBaseBean

public class DataBaseBean {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

LoginBean

public class LoginBean {/*** msg : 登录成功* code : 0* data : {"age":null,"appkey":"ac8ba969f32989c3","appsecret":"28D322D8CD6B2CB19066BC2FA46BE523","createtime":"2018-01-06T11:11:26","email":null,"fans":null,"follow":null,"gender":null,"icon":"https://www.zhaoapi.cn/images/15135575877781513557587554.png","latitude":null,"longitude":null,"mobile":"15011445154","money":null,"nickname":null,"password":"8F669074CAF5513351A2DE5CC22AC04C","praiseNum":null,"token":"20B1C03FC676062B3B866280A24B0A40","uid":4861,"userId":null,"username":"15011445154"}*/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 : ac8ba969f32989c3* appsecret : 28D322D8CD6B2CB19066BC2FA46BE523* createtime : 2018-01-06T11:11:26* email : null* fans : null* follow : null* gender : null* icon : https://www.zhaoapi.cn/images/15135575877781513557587554.png* latitude : null* longitude : null* mobile : 15011445154* money : null* nickname : null* password : 8F669074CAF5513351A2DE5CC22AC04C* praiseNum : null* token : 20B1C03FC676062B3B866280A24B0A40* uid : 4861* userId : null* username : 15011445154*/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 String 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 String getIcon() {return icon;}public void setIcon(String 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;}}
}

RegisterBean


public class RegisterBean {/*** msg : 注册成功* code : 0*/private String msg;private String code;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;}
}

SearchBean

public class SearchBean {/*** 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)银\r\n"},{"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 double bargainPrice;private String createtime;private String detailUrl;private String images;private int itemtype;private int pid;private double price;private int pscid;private int salenum;private int sellerid;private String subhead;private String title;public double getBargainPrice() {return bargainPrice;}public void setBargainPrice(double bargainPrice) {this.bargainPrice = bargainPrice;}public String getCreatetime() {return createtime;}public void setCreatetime(String createtime) {this.createtime = createtime;}public String getDetailUrl() {return detailUrl;}public void setDetailUrl(String detailUrl) {this.detailUrl = detailUrl;}public String getImages() {return images;}public void setImages(String images) {this.images = images;}public int getItemtype() {return itemtype;}public void setItemtype(int itemtype) {this.itemtype = itemtype;}public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getPscid() {return pscid;}public void setPscid(int pscid) {this.pscid = pscid;}public int getSalenum() {return salenum;}public void setSalenum(int salenum) {this.salenum = salenum;}public int getSellerid() {return sellerid;}public void setSellerid(int sellerid) {this.sellerid = sellerid;}public String getSubhead() {return subhead;}public void setSubhead(String subhead) {this.subhead = subhead;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}}
}

主包


Contents

public class Contents {public static final String HOST_NAME="http://120.27.23.105";public static final String LOGIN=HOST_NAME+"/user/login";public static final String REGISTER=HOST_NAME+"/user/reg";}

DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {//类没有实例化,是不能用作父类构造器的参数,必须声明为静态private static final String name = "count"; //数据库名称private static final int version = 1; //数据库版本public DatabaseHelper(Context context) {//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类super(context, name, null, version);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE  person ( id integer primary key autoincrement, name varchar(20) )");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

GoodsActivity

public class GoodsActivity extends AppCompatActivity implements SearchIView, XRecyclerView.LoadingListener, View.OnClickListener {private static final String TAG = "GoodsActivity";private int page = 1;private String searchName;private List<SearchBean.DataBean> data = new ArrayList<>();private SearchAdapter adapter;private XRecyclerView mRcvKind;private boolean isFresh = true;private boolean flag = true;private ImageView mIvKindBack;private ImageView mIvKindType;private LinearLayout mLlHead;private LinearLayout mLlNestToolBar;private LinearLayout mLlKindScro;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_goods);initView();Intent intent = getIntent();searchName = intent.getStringExtra("data");adapter = new SearchAdapter(this, data,1);LinearLayoutManager manager = new LinearLayoutManager(this);mRcvKind.setLayoutManager(manager);mRcvKind.setLoadingMoreEnabled(true);mRcvKind.setLoadingListener(this);mRcvKind.setAdapter(adapter);loadData(searchName, page);}private void loadData(String searchName, int page) {SearchPresenter presenter = new SearchPresenter();presenter.attach(this);presenter.getNews(searchName, page);}@Overridepublic void onSuccess(List<SearchBean.DataBean> newslist) {if (isFresh) {mRcvKind.refreshComplete();} else {mRcvKind.loadMoreComplete();}if (newslist != null) {if (isFresh) {data.clear();}data.addAll(newslist);adapter.notifyDataSetChanged();}if (page == 3) {Toast.makeText(this, "没有更多数据啦!", Toast.LENGTH_LONG).show();mRcvKind.loadMoreComplete();}}private void initView() {mRcvKind = (XRecyclerView) findViewById(R.id.rcv_kind);mIvKindBack = (ImageView) findViewById(R.id.iv_kind_back);mIvKindBack.setOnClickListener(this);mIvKindType = (ImageView) findViewById(R.id.iv_kind_type);mIvKindType.setOnClickListener(this);mLlHead = (LinearLayout) findViewById(R.id.ll_head);mLlNestToolBar = (LinearLayout) findViewById(R.id.ll_nest_toolBar);mRcvKind.setOnClickListener(this);mLlKindScro = (LinearLayout) findViewById(R.id.ll_kind_scro);mIvKindType.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (flag){adapter.notifyDataSetChanged();adapter = new SearchAdapter(GoodsActivity.this, data,2);mIvKindType.setImageDrawable(getResources().getDrawable(R.mipmap.liebiao));GridLayoutManager manager = new GridLayoutManager(GoodsActivity.this, 2);mRcvKind.setLayoutManager(manager);mRcvKind.setAdapter(adapter);flag = false;}else {adapter.notifyDataSetChanged();adapter = new SearchAdapter(GoodsActivity.this, data,1);mIvKindType.setImageDrawable(getResources().getDrawable(R.mipmap.kind_grid));LinearLayoutManager manager = new LinearLayoutManager(GoodsActivity.this);mRcvKind.setLayoutManager(manager);mRcvKind.setAdapter(adapter);flag = true;}}});}@Overridepublic void onRefresh() {isFresh = true;page = 1;loadData(searchName, page);}@Overridepublic void onLoadMore() {isFresh = false;if (page != 3) {page++;loadData(searchName, page);}}@Overridepublic void onClick(View v) {switch (v.getId()) {default:break;case R.id.iv_kind_back:finish();break;case R.id.rcv_kind:break;}}
}

MyInterceptor

public class MyInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request original = chain.request();HttpUrl url=original.url().newBuilder().addQueryParameter("source","android").build();//添加请求头Request request = original.newBuilder().url(url).build();return chain.proceed(request);}
}

SearchPresenter

public class SearchPresenter  {private SearchIView iv;public void attach(SearchIView iv){this.iv=iv;}public void detach(){if(iv!=null){iv=null;}}public void getNews(String keywords,int page){Map<String, String> map = new HashMap<>();map.put("keywords",keywords);map.put("page",page+"");SearchUtils.getInstance().post("http://120.27.23.105/product/searchProducts", map, new SearchCallback() {@Overridepublic void onSuccess( Object o) {SearchBean bean = (SearchBean) o;if (bean != null){List<SearchBean.DataBean> data = bean.getData();if(data!=null){iv.onSuccess(data);}}}@Overridepublic void onFailed( Exception e) {}}, SearchBean.class);}public void detachView(){if (iv!=null){iv = null;}}}

布局


activity_goods.xml

<?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.bwie.week2test.GoodsActivity"><LinearLayout
        android:id="@+id/ll_kind_scro"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
            android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
                android:orientation="vertical"android:fitsSystemWindows="true"android:id="@+id/ll_nest_toolBar"android:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayout                    android:id="@+id/ll_head"android:layout_alignParentTop="true"android:gravity="center_vertical"android:layout_width="match_parent"android:layout_height="50dp"><LinearLayout
                        android:padding="5dp"android:id="@+id/ll_sao"android:gravity="center"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="50dp"><ImageView
                            android:id="@+id/iv_kind_back"android:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/leftjiantou"/></LinearLayout><LinearLayout
                        android:id="@+id/ll_search"android:padding="5dp"android:background="@drawable/search_bg_select"android:layout_weight="1"android:layout_width="0dp"android:gravity="center_vertical"android:layout_height="30dp"><ImageView                            android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/search_icon2"/><TextView
                            android:layout_weight="1"android:padding="2dp"android:textColor="@color/search_tv"android:layout_width="0dp"android:textSize="@dimen/search_tv"android:layout_height="wrap_content"android:text="11.11品牌榜"/><ImageView                            android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/root"/></LinearLayout><LinearLayout
                        android:padding="5dp"android:id="@+id/ll_msg"android:gravity="center"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="50dp"><ImageView
                            android:id="@+id/iv_kind_type"android:layout_width="30dp"android:layout_height="30dp"android:src="@mipmap/kind_grid"/></LinearLayout></LinearLayout><View
                    android:layout_width="match_parent"android:layout_height="1dp"android:background="#ccc"></View></LinearLayout><View
                android:layout_width="match_parent"android:layout_height="1dp"android:background="#ccc"></View><View
                android:layout_width="match_parent"android:layout_height="1dp"android:background="#ccc"></View><com.jcodecraeer.xrecyclerview.XRecyclerView
                android:id="@+id/rcv_kind"android:layout_width="match_parent"android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView></LinearLayout></LinearLayout>
</LinearLayout>

activity_login.xml

<?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.bwie.week2test.view.LoginActivity"><TextView
        android:text="登录"android:padding="20dp"android:textSize="26sp"android:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"    /><View
        android:background="#000"android:visibility="visible"android:layout_height="1dp"android:layout_width="match_parent"></View><EditText
        android:id="@+id/mobile"android:hint="请输入手机号"android:layout_marginTop="28dp"android:layout_width="match_parent"android:layout_height="wrap_content"  /><EditText
        android:id="@+id/password"android:hint="请输入密码"android:layout_marginTop="28dp"android:layout_width="match_parent"android:layout_height="wrap_content"  /><RelativeLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"><Button
            android:text="登录"android:id="@+id/btnLogin"android:onClick="btnLogin"android:background="#1E90FF"android:layout_marginLeft="78dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="78dp"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_marginTop="54dp" /><Button
            android:text="注册"android:background="#1E90FF"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginRight="83dp"android:layout_marginEnd="83dp"android:layout_alignTop="@+id/btnLogin"android:onClick="btnRegister"android:layout_alignParentRight="true"android:layout_alignParentEnd="true" /></RelativeLayout></LinearLayout>

activity_register.xml

<?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.bwie.week2test.view.RegisterActivity"><RelativeLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"><TextView
            android:background="@drawable/back"android:padding="20dp"android:onClick="back"android:textSize="40sp"android:layout_width="28dp"android:layout_height="28dp"android:layout_alignParentLeft="true"android:layout_centerVertical="true"/><TextView
            android:text="注册"android:padding="20dp"android:textSize="26sp"android:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"    /><View
            android:background="#000"android:visibility="visible"android:layout_height="1dp"android:layout_below="@+id/text"android:layout_width="match_parent"></View></RelativeLayout><EditText
        android:id="@+id/regTel"android:hint="请输入手机号"android:layout_marginTop="28dp"android:layout_width="match_parent"android:layout_height="wrap_content"  /><EditText
        android:id="@+id/regPwd"android:hint="请输入密码"android:layout_marginTop="28dp"android:layout_width="match_parent"android:layout_height="wrap_content"  /><Button
        android:text="立即注册"android:onClick="regNow"android:background="#1E90FF"android:layout_marginTop="28dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"/></LinearLayout>

activity_search.xml

<?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.bwie.week2test.view.SearchActivity"><include layout="@layout/serach_layout" /><TextView
        android:background="@color/search_bg_select"android:layout_width="match_parent"android:layout_height="1dp" /><LinearLayout
        android:padding="5dp"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><TextView
            android:text="热搜"android:textColor="@color/tab_kind_normal"android:layout_width="wrap_content"android:layout_height="wrap_content" /><android.support.v7.widget.RecyclerView
            android:id="@+id/rvy_hot"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView></LinearLayout><LinearLayout
        android:orientation="vertical"android:padding="5dp"android:layout_width="match_parent"android:layout_height="match_parent"><TextView
            android:text="历史搜索"android:textColor="@color/tab_kind_normal"android:layout_width="wrap_content"android:layout_height="wrap_content" /><ListView            android:id="@+id/rcy_history"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView><Button
            android:id="@+id/clear_btn"android:text="清空历史搜索"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
</LinearLayout>

history_layout.xml

<?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"><TextView
        android:id="@+id/history_name"android:padding="10dp"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</LinearLayout>

item.xml

<?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"><TextView
        android:id="@+id/tv_name"android:layout_margin="10dp"android:textColor="#000"android:background="@drawable/textview_style"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</LinearLayout>

serach_layout.xml

<?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:orientation="horizontal"><LinearLayout
        android:id="@+id/ll_head"android:layout_width="match_parent"android:layout_height="50dp"android:background="#fff"android:gravity="center_vertical"android:orientation="horizontal"><ImageView
            android:id="@+id/iv_kind_back"android:layout_width="30dp"android:layout_marginLeft="10dp"android:layout_height="30dp"android:src="@mipmap/leftjiantou" /><LinearLayout
            android:id="@+id/ll_search"android:layout_width="wrap_content"android:layout_height="30dp"android:layout_weight="1"android:background="@drawable/search_bg_select"android:layout_marginRight="10dp"android:gravity="center_vertical"android:orientation="horizontal"android:padding="5dp"><ImageView                android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/search_icon2" /><EditText
                android:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:hint="请输入查找"android:padding="2dp"android:textColor="@color/search_tv"android:textSize="@dimen/search_tv" /><ImageView                android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/root" /></LinearLayout><LinearLayout
            android:id="@+id/ll_msg"android:layout_width="wrap_content"android:layout_height="50dp"android:gravity="center"android:padding="5dp"><TextView
                android:layout_marginRight="10dp"android:id="@+id/search_txt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="搜索"/></LinearLayout></LinearLayout></LinearLayout>

sublist_item.xml

<?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:gravity="center"><ImageView
        android:id="@+id/sublist_img"android:layout_width="100dp"android:layout_height="100dp"android:padding="10dp"android:src="@mipmap/ic_launcher" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:gravity="center_vertical"android:orientation="vertical"android:padding="10dp"><TextView            android:id="@+id/sublist_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按时打算打算打算打算的" /><RelativeLayout
            android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="10dp"android:orientation="horizontal"><TextView
                android:id="@+id/sublist_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#f00"android:text="188元"/><TextView                android:id="@+id/sublist_num"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginRight="20dp"android:text="10个" /></RelativeLayout></LinearLayout>
</LinearLayout>

sublist_item2.xml

<?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"android:gravity="center"><LinearLayout
        android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:gravity="center_vertical"android:orientation="vertical"android:padding="10dp"><ImageView
        android:id="@+id/sublist_img"android:layout_width="100dp"android:layout_height="100dp"android:padding="10dp"android:src="@mipmap/ic_launcher" /><TextView            android:id="@+id/sublist_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按时打算打算打算打算的" /><TextView
            android:id="@+id/sublist_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="188元"android:textColor="#f00"/></LinearLayout>
</LinearLayout>

drawable包


search_bg_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
<solid android:color="@color/search_bg_select"></solid><corners android:radius="50dp"></corners>
</shape>

textview_style.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#DDDDDD" /><corners android:radius="5dp" /><padding
        android:left="10dp"android:top="5dp"android:right="10dp"android:bottom="5dp" />
</shape>

values包


colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#3F51B5</color><color name="colorPrimaryDark">#303F9F</color><color name="colorAccent">#FF4081</color><color name="search_bg_select">#ddd</color><color name="search_tv">#fff</color><color name="tab_kind_normal">#000</color>
</resources>

dimens.xml

<resources><dimen name="fab_margin">16dp</dimen><dimen name="search_tv">12sp</dimen>
</resources>

接口MVP原生登录注册+搜索+recycleView切换展示相关推荐

  1. Android - 原生登录注册页面【仿】淘宝App

    bean文件夹:解析数据 LoginBean.java private String msg;private String code;private DataBean data;public Stri ...

  2. java实现登录注册案例_Java基于IO版实现用户登录注册的案例

    下面小编就为大家带来一篇基于IO版的用户登录注册实例(Java).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 今天学的是用户登录注册功能. 4个包: itcast.c ...

  3. 【原型制作】无素材-纯原生制作-登录注册页面原型图

    有一段时间没有做过原型图了,现在因为项目需要,得做一套完整的原型图,由于时间关系,考虑制作低保真的原型,虽然低保,还是得抓一把细节,嘻嘻,在这里记录下登录注册页面纯原生做法的全过程. 工具:Axure ...

  4. vue项目实践教程2:使用vux设计登录注册,并讲解vue路由,切换页面标题等内容

    上一章笔者介绍vux项目的搭建和简介,这里笔者设计几个登录注册页面,来讲解vux中的相关组件的使用,和vue的相关基础知识. 1.我们在与components文件夹同级的目录下创建一个views文件夹 ...

  5. 干货!flask登录注册token验证接口开发详解

    今天给大家献上登录注册接口开发,是基于token验证的.咱们闲言少叙,进入正题! 首先看一下数据库模型: #pip install passlib from passlib.apps import c ...

  6. 谷粒学院 Day12.登录页面模式、整合JWT、整合QQ邮箱、用户登录注册接口【后端】、用户登录注册【前端】

    项目结构: 配置文件 application.properties配置类 spring.jackson.time-zone=GMT+8# nacos注册中心 spring.cloud.nacos.di ...

  7. springboot后台搭建及登录注册接口编写

    目录 前言 相关技术: 一.使用idea创建springboot项目 二.搭建三层框架dao层.service层.controller层+实体model层: 三.实现登录注册接口 前言 相关技术: 框 ...

  8. PHP+MySQL实现用户登录注册API接口

    最近在学习PHP后台相关知识,利用PHP连接MySQL数据库实现了一个简单的用户登录注册及修改密码的API接口,接口为标准的json输出,本地验证通过.功能比较简单,不过也自己摸索了挺长时间,期间各种 ...

  9. jQuery带背景切换登录注册表单

    jQuery带背景切换登录注册表单 原始HTML+CSS+JS页面设计,这是一个不错的登录网页制作,画面精明,非常适合初学者学习使用. 作品介绍 1.网页作品简介方面 :jQuery带背景切换登录注册 ...

最新文章

  1. Outlook 2010如何更改脱机缓存数据OST文件位置?
  2. Unity 2D游戏开发快速入门(内部资料)
  3. linux系统参加网络会议,在Deepin Linux系统下运行腾讯会议的方略
  4. 技术大牛收割机!Java之父James Gosling现在哪里???
  5. catia钣金根据线段折弯_钣金折弯加工注意事项有哪些?钣金折弯要点介绍
  6. android 怎么自定义任务栈,Android中的Activity详解--启动模式与任务栈
  7. Python操作文件和目录
  8. 回溯算法 思路清晰,通俗易懂!!!!!!!
  9. Makefile的几个赋值运算符(转:笔记)
  10. Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解
  11. NOIP模拟赛20161016R1
  12. python 实现数据化大屏_基于Python实现交互式数据可视化的工具(用于Web)
  13. Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
  14. curl命令多行执行
  15. 程序员工资到底有多高?国内哪个城市挣得最多?有没有你在的城市
  16. JS 下拉菜单内容交换
  17. java mye,JAVA-MyEclipse第一个实例
  18. 秋招选择题(二)图形推理题
  19. oracle客户端插件,oracle instantclient_11_2插件安装
  20. ES6 ~ ES11整理

热门文章

  1. 项目管理之道之团队管理,团队成员不服从怎么办
  2. 韩非子中的管理故事2 (赏罚)
  3. 手机的一些使用功能,你知道吗?
  4. php获取远程文件大小转mb,php获取文件大小_php获取文件大小并转换gb,mb,kb代码
  5. 让你痛苦的5个心理陷阱
  6. 安卓打开rpm文件_Android 打开各种文件适配7.0
  7. 微信公众平台开发(十) 消息回复总结——用其xml模板
  8. 笔记本网线连接打印机_需要一台笔记本电脑打印机如何很难找到电子产品
  9. Salesforce上的Saas生态大玩家 Veeva是如何炼成的?
  10. Oracle11gR2集群心跳单网卡改bond实施方案