自定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TopBar">
<attr name="leftButton" format="string"></attr>
<attr name="leftColor" format="color"></attr>
<attr name="text1" format="string"></attr>
<attr name="textColor" format="string"></attr>
<attr name="rightButton" format="string"></attr>
<attr name="rightColor" format="color"></attr>
</declare-styleable>
</resources>
自定义控件布局
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="5dp"
android:layout_marginRight="12dp"
android:orientation="horizontal">
<Button
android:text="搜索"
android:id="@+id/bt_search"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="right|center_vertical"
android:layout_margin="10dp"
android:background="#00f" />
<EditText
android:id="@+id/et_search"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_weight="4"
android:background="@null"
android:gravity="center_vertical"
android:hint="输入内容进行搜索"
android:imeOptions="actionSearch"
android:singleLine="true"
android:textColor="#0e0e0e"
android:textColorHint="#b0c6ce"
android:textSize="17sp" />
<Button
android:id="@+id/bt_clear"
android:text="删除"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="right|center_vertical"
android:layout_margin="10dp"
android:background="#ff0"
/>
</LinearLayout>
</LinearLayout>
自定义搜索框SearchView
package com.example.day8_test;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
/*
*********************************
*作者:wangyaowei
*时间:2019/2/21 22:09
**
*
*********************************
*/public class SearchView extends LinearLayout implements TextWatcher,View.OnClickListener {
/**
* 输入框
*/
private EditText et_search;
/**
* 输入框后面的那个清除按钮
*/
private Button bt_clear;
private final Button bt_search;
public SearchView(Context context, AttributeSet attrs) {
super(context, attrs);
/**加载布局文件*/
LayoutInflater.from(context).inflate(R.layout.pub_searchview, this, true);
/***找出控件*/
bt_search = findViewById(R.id.bt_search);
et_search = (EditText) findViewById(R.id.et_search);
bt_clear = (Button) findViewById(R.id.bt_clear);
// bt_clear.setVisibility(GONE);
et_search.addTextChangedListener(this);
bt_clear.setOnClickListener(this);
bt_search.setOnClickListener(this);
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
/****
* 对用户输入文字的监听
*
* @param editable
*/
@Override
public void afterTextChanged(Editable editable) {
/**获取输入文字**/
String input = et_search.getText().toString().trim();
if (input.isEmpty()) {
bt_clear.setVisibility(GONE);
} else {
bt_clear.setVisibility(VISIBLE);
}
}
//实现点击事件的方法
@Override
public void onClick(View view) {
// et_search.setText("");
switch (view.getId()){
case R.id.bt_clear:
et_search.setText("");
break;
case R.id.bt_search:
String s = et_search.getText().toString();
onSerchListener.onResult(s);
break;
}
}
//接口回调
public interface OnSerchListener{
void onResult(String s);
}
private OnSerchListener onSerchListener;
public void setOnSerchListener(OnSerchListener onSerchListener) {
this.onSerchListener = onSerchListener;
}
}
主页面
package com.example.day8_test;
import android.os.Build;
import android.os.Handler;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import com.bawei.swiperefreshlayoutlibrary.SwipyRefreshLayout;
import com.bawei.swiperefreshlayoutlibrary.SwipyRefreshLayoutDirection;
import com.example.day8_test.adapter.MyRecyclerAdapter;
import com.example.day8_test.presenter.GoodsPresenter;
import com.example.day8_test.view.GoodsView;
import org.json.JSONArray;
import org.json.JSONException;
public class MainActivity extends AppCompatActivity implements SearchView.OnSerchListener,GoodsView {
private int page=1;
private Handler handler=new Handler();
private com.example.day8_test.SearchView serch;
private RecyclerView rlv;
private String sou="板鞋";
private GoodsPresenter goodsPresenter;
private SwipyRefreshLayout srl;
private JSONArray result1=null;
// private List<GoodsJson.ResultBean> resultBeans;
// private List<GoodsJson.ResultBean> result=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1找控件
serch = findViewById(R.id.serch);
rlv = findViewById(R.id.rlv);
//刷新控件
srl = findViewById(R.id.srl);
//设置布局管理器
GridLayoutManager manager=new GridLayoutManager(this,2);
rlv.setLayoutManager(manager);
//2创建GoodsPresenter
goodsPresenter = new GoodsPresenter(this);
goodsPresenter.related(sou, page);
srl.setColorSchemeResources(R.color.colorAccent,R.color.colorPrimaryDark,R.color.colorPrimary);
srl.setDirection(SwipyRefreshLayoutDirection.BOTH);
srl.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh(int index) {
page=1;
goodsPresenter.related(sou,page);
handler.postDelayed(new Runnable() {
@Override
public void run() {
srl.setRefreshing(false);
}
},2000);
}
@Override
public void onLoad(int index) {
page++;
goodsPresenter.related(sou, page);
handler.postDelayed(new Runnable() {
@Override
public void run() {
srl.setRefreshing(false);
}
},2000);
}
});
//注册
serch.setOnSerchListener(this);
}
//回调输入框得到的数据
@Override
public void onResult(String s) {
sou=s;
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
goodsPresenter.related(sou, page);
}
//得到json集合数据
@Override
public void onResult(JSONArray result) {
//设置适配器
if (page==1){
result1 = new JSONArray();
// resultBeans = new ArrayList<GoodsJson.ResultBean>();
}
for (int i=0;i<result.length();i++){
try {
result1.put(result.get(i));
} catch (JSONException e) {
e.printStackTrace();
}
// result.add(resultBeans.get(i));
}
final MyRecyclerAdapter myRecyclerAdapter = new MyRecyclerAdapter(MainActivity.this, result1);
/*
* 删除条目
* */
rlv.setAdapter(myRecyclerAdapter);
myRecyclerAdapter.OnRecyclerViewItemLongClickLisenter(new MyRecyclerAdapter.OnRecyclerViewItemLongClickLisenter() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void OnRecyclerViewItemLongClickLisenter(int position) {
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
myRecyclerAdapter.removeItem(position);
}
});
}
}
P层
package com.example.day8_test.presenter;
import com.example.day8_test.model.GoodsModel;
import com.example.day8_test.view.GoodsView;
import org.json.JSONArray;
/*
*********************************
*作者:wangyaowei
*时间:2019/2/21 19:56
**
*
*********************************
*/public class GoodsPresenter {
private final GoodsModel goodsModel;
private final GoodsView goodsView;
//有参构造
public GoodsPresenter(GoodsView view) {
//创建model
goodsModel = new GoodsModel();
goodsView = view;
}
//关联
public void related(String sou, int page) {
goodsModel.getData(sou,page);
goodsModel.setOnGetGoodsListen(new GoodsModel.OnGetGoodsListen() {
@Override
public void onResult(JSONArray result) {
//传递数据接口
goodsView.onResult(result);
}
});
}
}
M层
package com.example.day8_test.model;
import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.example.day8_test.bean.GoodsJson;
import com.example.day8_test.utils.OkHttpUtils;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/*
*********************************
*作者:wangyaowei
*时间:2019/2/21 19:55
**
*
*********************************
*/public class GoodsModel {
//接口回调
public interface OnGetGoodsListen{
void onResult(JSONArray result);
}
private OnGetGoodsListen onGetGoodsListen;
public void setOnGetGoodsListen(OnGetGoodsListen onGetGoodsListen) {
this.onGetGoodsListen = onGetGoodsListen;
}
public void getData(String sou, int page) {
String path="http://172.17.8.100/small/commodity/v1/findCommodityByKeyword?keyword="+sou+"&page="+page+"&count=5";
//引用网络工具类
OkHttpUtils.getInstence().getData(path, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
//Handler
Message message = new Message();
message.what=0;
message.obj=string;
handler.sendMessage(message);
}
});
}
//handler接受消息
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
String obj= (String) msg.obj;
try {
JSONObject jsonObject = new JSONObject(obj);
JSONArray result = jsonObject.getJSONArray("result");
if(onGetGoodsListen!=null){
onGetGoodsListen.onResult(result);
}
} catch (JSONException e) {
e.printStackTrace();
}
/*Gson gson = new Gson();
GoodsJson goodsJson = gson.fromJson(obj, GoodsJson.class);
List<GoodsJson.ResultBean> result = goodsJson.getResult();
Log.d("xxx",result.toString());*/
break;
}
}
};
}
V层
package com.example.day8_test.view;
import com.example.day8_test.bean.GoodsJson;
import org.json.JSONArray;
import java.util.List;
/*
*********************************
*作者:wangyaowei
*时间:2019/2/21 19:56
**
*
*********************************
*/public interface GoodsView {
void onResult(JSONArray result);
}
**```
网络请求**
package com.example.day8_test.utils;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/*
*作者:wangyaowei
*时间:2019/2/21 19:56
**
*
*/public class OkHttpUtils {
//声明
private static OkHttpUtils okHttpUtils=null;
public OkHttpUtils() {
}
//返回实例的方法
public static OkHttpUtils getInstence(){
if(okHttpUtils==null){
synchronized (OkHttpUtils.class){
okHttpUtils=new OkHttpUtils();
}
}
return okHttpUtils;
}
//创建Okshi
private static OkHttpClient okHttpClient=null;
public static synchronized OkHttpClient getOkHttpClient(){
if(okHttpClient==null){
okHttpClient = new OkHttpClient();
}
return okHttpClient;
}
//得到Ok
public static void getData(String url, Callback callback){
//得到ok对象
OkHttpClient okHttpClient = getOkHttpClient();
//得到请求
Request request=new Request.Builder().url(url).build();
//请求
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
}
``适配器`
适配器
package com.example.day8_test.adapter;
import android.content.Context;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.day8_test.R;
import com.example.day8_test.bean.GoodsJson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.List;
/*
*********************************
*作者:wangyaowei
*时间:2019/2/21 22:24
**
*
*********************************
*/public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewhodler> {
private Context context;
private JSONArray result;
public MyRecyclerAdapter(Context context, JSONArray result) {
this.context = context;
this.result = result;
}
public interface OnRecyclerViewItemLongClickLisenter{
void OnRecyclerViewItemLongClickLisenter(int position);
}
private OnRecyclerViewItemLongClickLisenter longClickLisenter;
public void OnRecyclerViewItemLongClickLisenter(OnRecyclerViewItemLongClickLisenter longClickLisenter){
this.longClickLisenter=longClickLisenter;
}
@NonNull
@Override
public MyViewhodler onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item, null, false);
final MyViewhodler myViewhodler = new MyViewhodler(view);
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//获取view的相对位置
int layoutPosition=myViewhodler.getLayoutPosition();
//接口回调数据
if (longClickLisenter!=null){
longClickLisenter.OnRecyclerViewItemLongClickLisenter(layoutPosition);
}
return true;
}
});
return myViewhodler;
}
@Override
public void onBindViewHolder(@NonNull MyViewhodler myViewhodler, int i) {
try {
JSONObject jsonObject = result.getJSONObject(i);
String commodityName = jsonObject.getString("commodityName");
String masterPic = jsonObject.getString("masterPic");
String price = jsonObject.getString("price");
myViewhodler.title.setText(commodityName);
myViewhodler.price.setText(price);
Glide.with(context).load(masterPic).into(myViewhodler.img);
} catch (JSONException e) {
e.printStackTrace();
}
/*String name = result.get(i).getCommodityName();
int price = result.get(i).getPrice();
//数据
Glide.with(context).load(list.get(i).getMasterPic()).into(myViewhodler.img);
myViewhodler.title.setText(name);
myViewhodler.price.setText(price+"");
*/
}
@Override
public int getItemCount() {
return result.length();
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void removeItem(int position){
result.remove(position);
//刷新
notifyDataSetChanged();
}
class MyViewhodler extends RecyclerView.ViewHolder {
private final ImageView img;
private final TextView title;
private final TextView price;
public MyViewhodler(@NonNull View itemView) {
super(itemView);
img = itemView.findViewById(R.id.img);
title = itemView.findViewById(R.id.title);
price = itemView.findViewById(R.id.price);
}
}
}