自定义组合搜索框,页面展示刷新加载和条目删除

自定义属性

<?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);


        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44405056/article/details/87923577