ListView实现购物车功能包含单选与多选和修改数量

本来认为应该很容易,直接一个listview就能搞定了,但是写着写着就发现了问题,在listview中嵌入edittext时,点击条目编辑EditText时焦点会对不上, 点了此条目的edittext输入的东西却不显示在这个listview条目中,所以需要手动设置焦点,并且需要记得下点击的条目的postition,通过给条目设置ontouch事件来记录postition,然后通过对比postition来设置edittext的焦点,从而达到目的,最主要的代码是在adapter的getview中记录下postition。

1.activity

package com.xiaomizhuang.buildcaptain.activity;

import android.graphics.drawable.BitmapDrawable;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hbw.library.BaseActivity;
import com.hbw.library.entity.ResponseSucceedData;
import com.hbw.library.utils.ToastUtil;
import com.xiaomizhuang.buildcaptain.R;
import com.xiaomizhuang.buildcaptain.adapter.AssistAdvocateMaterialOrderAdapter;
import com.xiaomizhuang.buildcaptain.entity.AssistAdvocateMaterialOrder;
import com.xiaomizhuang.buildcaptain.entity.AssistMaterialOrder;
import com.xiaomizhuang.buildcaptain.util.HttpConstant;
import com.xiaomizhuang.buildcaptain.view.HintDialog;

import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by user on 2016/1/19.主材下单
 */
public class AssistAdvocateMaterialOrderActivity extends BaseActivity implements View.OnClickListener {

    private ListView order_list;
    private LinearLayout order_all_select;
    private TextView order_all_money;
    private ImageView order_all_select_img;
    private Button order_submit;
    private HashMap<String, String> mMap = new HashMap<String, String>();

    private ArrayList<AssistAdvocateMaterialOrder> mAssistAdvocateMaterialOrders = new ArrayList<AssistAdvocateMaterialOrder>();//主材信息
    private AssistAdvocateMaterialOrderAdapter mAssistAdvocateMaterialOrderAdapter = null;
    private List<AssistMaterialOrder> orderlists = new ArrayList<AssistMaterialOrder>();//订单

    private boolean isAllChoose = false;//默认为未全选

    private HintDialog mHintDialog = null, mMustDialog = null;

    @Override
    protected void initWidget() {
        titleBar.setTitleText("主材数量确认");
        titleBar.setLeftImgDefaultBack(this);

        order_list = (ListView) findViewById(R.id.order_list);
        order_all_select = (LinearLayout) findViewById(R.id.order_all_select);
        order_all_money = (TextView) findViewById(R.id.order_all_money);
        order_submit = (Button) findViewById(R.id.order_submit);
        order_all_select_img = (ImageView) findViewById(R.id.order_all_select_img);

        //初始化提示框
        if (mHintDialog == null) {
            mHintDialog = new HintDialog(this);
        }
        mHintDialog.setTitleText("确认修改主材数量吗").setConfirmListener(this).setCancelListener(this);

        if (mMustDialog == null) {
            mMustDialog = new HintDialog(this);
        }
        mMustDialog.setConfirmListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mMustDialog.dismiss();
            }
        }).setCancelHint();
        order_all_select.setOnClickListener(this);
        order_submit.setOnClickListener(this);

        mAssistAdvocateMaterialOrderAdapter = new AssistAdvocateMaterialOrderAdapter(this,this, mAssistAdvocateMaterialOrders, orderlists,
                new AssistAdvocateMaterialOrderAdapter.TotalPrice() {
                    @Override
                    public void TotalPriceChange() {
                        //计算总价
                        int countPrice = 0;
                        for (int i = 0; i < orderlists.size(); i++) {
                            //判断该主材是否为选中状态
                            if (mAssistAdvocateMaterialOrders.get(i).isChoose()) {
                                if (orderlists.get(i).getAct_total_price() != null && !"".equals(orderlists.get(i).getAct_total_price())) {
                                    countPrice += Float.parseFloat(orderlists.get(i).getAct_total_price());
                                }
                            }
                        }
                        order_all_money.setText(countPrice + "元");
                        countPrice = 0;
                    }
                });
        order_list.setAdapter(mAssistAdvocateMaterialOrderAdapter);

        mMap.put("uid", getIntent().getStringExtra("uid"));//工地列表传过来的id号(业主id)
        analyzeJson.requestData(HttpConstant.ZcOrderDetails, mMap, REQUEST_SUCCESS);
    }

    @Override
    protected void initData() {

    }

    @Override
    protected int initPageLayoutID() {
        return R.layout.activity_assist_advocate_material_order;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.order_all_select://全选
                if (isAllChoose) {
                    isAllChoose = false;
                    isAllChoose(isAllChoose);
                    order_all_select_img.setImageBitmap(((BitmapDrawable) getResources().getDrawable(R.mipmap.nochoose)).getBitmap());
                    mAssistAdvocateMaterialOrderAdapter.notifyDataSetChanged(mAssistAdvocateMaterialOrders, orderlists);
                } else {
                    isAllChoose = true;
                    isAllChoose(isAllChoose);
                    order_all_select_img.setImageBitmap(((BitmapDrawable) getResources().getDrawable(R.mipmap.ic_choose)).getBitmap());
                    mAssistAdvocateMaterialOrderAdapter.notifyDataSetChanged(mAssistAdvocateMaterialOrders, orderlists);
                }
                break;
            case R.id.hintdialog_cancel://关闭表单提醒框
                mHintDialog.dismiss();
                break;
            case R.id.order_submit:
                mHintDialog.show();
                break;
            case R.id.hintdialog_confirm://提交主材订单
                mHintDialog.dismiss();
                List<AssistMaterialOrder> orders = new ArrayList<AssistMaterialOrder>();//订单
                for (int i = 0; i < mAssistAdvocateMaterialOrders.size(); i++) {
                    if (mAssistAdvocateMaterialOrders.get(i).isChoose()) {
                        orders.add(orderlists.get(i));
                    }
                }
                //判断勾选主材数量不能为0
                if (orders.size() == 0) {
                    mMustDialog.setTitleText("请选择要修改的主材订单");
                    mMustDialog.show();
                    break;
                }
                //将数组转换成json格式
                Gson gson = new Gson();
                mMap.put("data", gson.toJson(orders));
                analyzeJson.requestData(HttpConstant.ZcOrderFucaiUrl, mMap, 0x1010);
                break;
        }
    }

    private void isAllChoose(boolean isAllChoose) {
        //遍历主材信息,将选中属性全部设为传进来的参数
        for (int i = 0; i < mAssistAdvocateMaterialOrders.size(); i++) {
            mAssistAdvocateMaterialOrders.get(i).setIsChoose(isAllChoose);
        }
    }

    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case REQUEST_SUCCESS:
                ResponseSucceedData data = (ResponseSucceedData) msg.obj;
                mAssistAdvocateMaterialOrders = gson.fromJson(data.data, new TypeToken<List<AssistAdvocateMaterialOrder>>() {
                }.getType());
                for (int i = 0; i < mAssistAdvocateMaterialOrders.size(); i++) {
                    AssistMaterialOrder mAssistMaterialOrder = new AssistMaterialOrder();
                    mAssistMaterialOrder.setId(mAssistAdvocateMaterialOrders.get(i).getId());
                    mAssistMaterialOrder.setAct_count(mAssistAdvocateMaterialOrders.get(i).getAct_count());
                    mAssistMaterialOrder.setAct_total_price("" + Integer.parseInt(mAssistAdvocateMaterialOrders.get(i).getAct_count()) * Float.parseFloat(mAssistAdvocateMaterialOrders.get(i).getAct_price()));
                    orderlists.add(mAssistMaterialOrder);
                }
                mAssistAdvocateMaterialOrderAdapter.notifyDataSetChanged(mAssistAdvocateMaterialOrders, orderlists);
                break;
            case 0x1010://提交订单成功
                mHintDialog.dismiss();
                ToastUtil.show(this, "主材数量修改成功");
                //把数据清空
                orderlists.clear();
                mAssistAdvocateMaterialOrders.clear();
                mMap.clear();
                isAllChoose = false;
                mAssistAdvocateMaterialOrderAdapter = null;
                //重新请求
                initWidget();
                break;
        }
        return super.handleMessage(msg);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mHintDialog != null) {
            mHintDialog.dismiss();
        }
        if (mMustDialog != null) {
            mMustDialog.dismiss();
        }
    }

}

2.adapter

package com.xiaomizhuang.buildcaptain.adapter;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.hbw.library.AbsBaseAdapter;
import com.xiaomizhuang.buildcaptain.R;
import com.xiaomizhuang.buildcaptain.entity.AssistAdvocateMaterialOrder;
import com.xiaomizhuang.buildcaptain.entity.AssistMaterialOrder;
import com.xiaomizhuang.buildcaptain.view.AddAndSubView;
import com.xiaomizhuang.buildcaptain.view.PopMaterialOrder;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by user on 2016/1/19.
 */
public class AssistAdvocateMaterialOrderAdapter extends AbsBaseAdapter<AssistAdvocateMaterialOrder> {

    private int index = -1;//记录点击的列表项位置
    private Context context;
    private List<AssistMaterialOrder> orderlists;//订单
    private TotalPrice mTotalPrice;//数量改变监听对象
    private Activity activity;

    public AssistAdvocateMaterialOrderAdapter(Activity activity,Context context, List<AssistAdvocateMaterialOrder> dataList, List<AssistMaterialOrder> orderlists, TotalPrice mTotalPrice) {
        super(dataList);
        this.context = context;
        this.orderlists = orderlists;
        this.mTotalPrice = mTotalPrice;
        this.activity = activity;
    }

    @Override
    public View getView(final int position, View v, ViewGroup parent) {
        //条目数量不会太多,所以这里不考虑重用了,因为重用会导致数据错乱
        v = View.inflate(context, R.layout.list_item_material_order, null);
        LinearLayout order_item_choose_LinearLayout = (LinearLayout) v.findViewById(R.id.order_item_choose_LinearLayout);
        ImageView order_item_choose_img = (ImageView) v.findViewById(R.id.order_item_choose_img);
        TextView order_item_title = (TextView) v.findViewById(R.id.order_item_title);
        TextView order_item_price = (TextView) v.findViewById(R.id.order_item_price);
        TextView order_item_unit = (TextView) v.findViewById(R.id.order_item_unit);
        TextView order_item_serial_number = (TextView) v.findViewById(R.id.order_item_serial_number);
        LinearLayout order_item_details_LinearLayout = (LinearLayout) v.findViewById(R.id.order_item_details_LinearLayout);
        //设置自定义AddAndSubView属性
        AddAndSubView order_item_addandsubview = (AddAndSubView) v.findViewById(R.id.order_item_addandsubview);
        order_item_addandsubview.setButtonBgDrawable(context.getResources().getDrawable(R.mipmap.add), context.getResources().getDrawable(R.mipmap.line));
        order_item_addandsubview.getEditText().setBackgroundColor(context.getResources().getColor(R.color.background_dcdcdc));
        LinearLayout.LayoutParams viewLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        viewLayoutParams.setMargins(6, 0, 12, 0);
        order_item_addandsubview.getEditText().setLayoutParams(viewLayoutParams);
        order_item_addandsubview.setButtonLayoutParm(40, 40);
        order_item_addandsubview.setEditTextLayoutHeight(40);
        order_item_addandsubview.setEditTextMinimumWidth(70);
        order_item_addandsubview.setEditTextLayoutWidth(70);

        EditText editText = order_item_addandsubview.getEditText();
        Button addButton = order_item_addandsubview.getAddButton();
        Button subButton = order_item_addandsubview.getSubButton();
        //设置数据
        order_item_title.setText(dataList.get(position).getMaterial_name());
        order_item_serial_number.setText("订单编号: " + dataList.get(position).getId());

        order_item_unit.setText(dataList.get(position).getUnit());
        order_item_price.setText(dataList.get(position).getAct_price());

        if (!"".equals(orderlists.get(position).getAct_count())) {
            editText.setText(orderlists.get(position).getAct_count());
        }
        if (dataList.get(position).isChoose()) {
            order_item_choose_img.setImageBitmap(((BitmapDrawable) context.getResources().getDrawable(R.mipmap.ic_choose)).getBitmap());
        } else {
            order_item_choose_img.setImageBitmap(((BitmapDrawable) context.getResources().getDrawable(R.mipmap.nochoose)).getBitmap());
        }
        //设置事件
        order_item_choose_LinearLayout.setOnTouchListener(new mOnTouchListener(position));
        order_item_choose_LinearLayout.setOnClickListener(new mOnClickListener(position, order_item_choose_img));
        addButton.setOnTouchListener(new mOnTouchListener(position));
        subButton.setOnTouchListener(new mOnTouchListener(position));
        editText.setOnTouchListener(new mOnTouchListener(position));
        editText.addTextChangedListener(new mTextWatcher(position));
        order_item_details_LinearLayout.setOnClickListener(new order_item_details_LinearLayout_listener(this,position));
        editText.clearFocus();
        if (index != -1 && index == position) {
            // 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。
            editText.requestFocus();
        }
        return v;
    }

    public void notifyDataSetChanged(List<AssistAdvocateMaterialOrder> dataList, List<AssistMaterialOrder> orderlists) {
        if (dataList != null && dataList.size() > 0) {
            this.dataList = dataList;
        } else {
            this.dataList = new ArrayList<AssistAdvocateMaterialOrder>();
        }
        if (orderlists != null && orderlists.size() > 0) {
            this.orderlists = orderlists;
        } else {
            this.orderlists = new ArrayList<AssistMaterialOrder>();
        }
        notifyDataSetChanged();
        //全选与不全选也要调用重新计算总价
        mTotalPrice.TotalPriceChange();
    }

    //list每项数量发生变化监听接口,用于计算总价
    public interface TotalPrice {
        void TotalPriceChange();
    }

    public List<AssistMaterialOrder> getOrderlists() {
        return orderlists;
    }

    public void setOrderlists(List<AssistMaterialOrder> orderlists) {
        this.orderlists = orderlists;
    }

    class mTextWatcher implements TextWatcher {

        private int position;

        public mTextWatcher(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence text, int start, int before, int count) {
            if (index != -1 && index == position) {
                // 在这个地方添加你的保存文本内容的代码,如果不保存,你就等着重新输入吧
                // 而且不管你输入多少次,也不会有用的,因为getView全清了~~
                if (!"".equals(text.toString()) && text.toString() != null) {
//                    Log.e("TextWatcher-->", "count = " + text.toString() +
//                            ",price = " + dataList.get(position).getAct_price() +
//                            ",countPrice = " + Integer.parseInt(text.toString()) * Float.parseFloat(dataList.get(position).getAct_price()) +
//                            ",position = " + position);
                    //设置订单数据(数量,总价)
                    orderlists.get(position).setAct_count(text.toString());
                    orderlists.get(position).setAct_total_price(Integer.parseInt(text.toString()) * Float.parseFloat(dataList.get(position).getAct_price()) + "");
                } else {
                    //如果数量为null,将总价设置为null,数量设置为0
                    orderlists.get(position).setAct_count("0");
                    orderlists.get(position).setAct_total_price("0");
                }
                mTotalPrice.TotalPriceChange();
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    }

    class mOnTouchListener implements View.OnTouchListener {

        private int position;

        public mOnTouchListener(int position) {
            this.position = position;
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // 在TOUCH的UP事件中,要保存当前的行下标,因为弹出软键盘后,整个画面会被重画
            // 在getView方法的最后,要根据index和当前的行下标手动为EditText设置焦点
            if (event.getAction() == MotionEvent.ACTION_UP) {
                index = position;
            }
            return false;
        }
    }

    class mOnClickListener implements View.OnClickListener {

        private int position;
        private ImageView order_item_choose_img;

        public mOnClickListener(int position, ImageView order_item_choose_img) {
            this.position = position;
            this.order_item_choose_img = order_item_choose_img;
        }

        @Override
        public void onClick(View v) {
            if (index != -1 && index == position) {
                if (dataList.get(position).isChoose()) {
                    dataList.get(position).setIsChoose(false);
                    order_item_choose_img.setImageBitmap(((BitmapDrawable) context.getResources().getDrawable(R.mipmap.nochoose)).getBitmap());
                } else {
                    dataList.get(position).setIsChoose(true);
                    order_item_choose_img.setImageBitmap(((BitmapDrawable) context.getResources().getDrawable(R.mipmap.ic_choose)).getBitmap());
                }
                //选中与不选中同意要计算总价
                mTotalPrice.TotalPriceChange();
            }
        }
    }

    class order_item_details_LinearLayout_listener implements View.OnClickListener{

        private AssistAdvocateMaterialOrderAdapter mAssistAdvocateMaterialOrderAdapter;
        private int position;

        public order_item_details_LinearLayout_listener(AssistAdvocateMaterialOrderAdapter mAssistAdvocateMaterialOrderAdapter,int position){
            this.mAssistAdvocateMaterialOrderAdapter = mAssistAdvocateMaterialOrderAdapter;
            this.position = position;
        }

        @Override
        public void onClick(View v) {
            PopMaterialOrder popTelphone = new PopMaterialOrder(activity, dataList, orderlists,position,mTotalPrice,mAssistAdvocateMaterialOrderAdapter);
            popTelphone.showAtLocation(v, Gravity.BOTTOM, 0, 0);
        }
    }
}

3.自定义加减可输入数量控件

package com.xiaomizhuang.buildcaptain.view;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;


public class AddAndSubView extends LinearLayout {
    private Context context;
    private LinearLayout mainLinearLayout; // 主View,即AddAndSubView
    private LinearLayout leftLinearLayout; // 内部左view
    private LinearLayout centerLinearLayout; // 中间view
    private LinearLayout rightLinearLayout; // 内部右view
    private OnNumChangeListener onNumChangeListener;
    private Button addButton;
    private Button subButton;
    private EditText editText;
    private int num; // editText中的数值
    private int editTextLayoutWidth; // editText视图的宽度
    private int editTextLayoutHeight; // editText视图的宽度
    private int editTextMinimumWidth; // editText视图的最小宽度
    private int editTextMinimumHeight; // editText视图的最小高度
    private int editTextMinHeight; // editText文本区域的最小高度
    private int editTextHeight; // editText文本区域的高度

    public Button getAddButton() {
        return addButton;
    }

    public void setAddButton(Button addButton) {
        this.addButton = addButton;
    }

    public Button getSubButton() {
        return subButton;
    }

    public void setSubButton(Button subButton) {
        this.subButton = subButton;
    }

    public EditText getEditText() {
        return editText;
    }

    public void setEditText(EditText editText) {
        this.editText = editText;
    }

    public AddAndSubView(Context context) {
        super(context);
        this.context = context;
        num = 0;
        control();
    }

    /**
     * 带初始数据实例化
     *
     * @param context
     * @param初始数据
     */
    public AddAndSubView(Context context, int num) {
        super(context);
        this.context = context;
        this.num = num;
        control();
    }

    /**
     * 从XML中实例化
     */
    public AddAndSubView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        num = 0;
        control();
    }

    private void control() {
        initTextWithHeight();
        initialise(); // 实例化内部view
        setViewsLayoutParm(); // 设置内部view的布局参数
        insertView(); // 将子view放入linearlayout中
        setViewListener();
    }

    /**
     * 初始化EditText宽高参数
     */
    private void initTextWithHeight() {
        editTextLayoutWidth = -1;
        editTextLayoutHeight = -1;
        editTextMinimumWidth = -1;
        editTextMinimumHeight = -1;
        editTextMinHeight = -1;
        editTextHeight = -1;
    }

    /**
     * 实例化内部View
     */
    private void initialise() {
        mainLinearLayout = new LinearLayout(context);
        leftLinearLayout = new LinearLayout(context);
        centerLinearLayout = new LinearLayout(context);
        rightLinearLayout = new LinearLayout(context);
        addButton = new Button(context);
        subButton = new Button(context);
        editText = new EditText(context);

        addButton.setText("+");
        subButton.setText("-");
        addButton.setTag("+");
        subButton.setTag("-");
        // 设置输入类型为数字
        editText.setInputType(android.text.InputType.TYPE_CLASS_NUMBER);
        editText.setText(String.valueOf(num));
    }

    /**
     * 设置内部view的布局参数
     */
    private void setViewsLayoutParm() {
        LayoutParams viewLayoutParams = new LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        addButton.setLayoutParams(viewLayoutParams);
        subButton.setLayoutParams(viewLayoutParams);
        editText.setLayoutParams(viewLayoutParams);
        editText.setGravity(Gravity.CENTER);
        setTextWidthHeight();

        viewLayoutParams.gravity = Gravity.CENTER;
        centerLinearLayout.setLayoutParams(viewLayoutParams);
        // 让editText不自动获得焦点
        centerLinearLayout.setFocusable(true);
        centerLinearLayout.setFocusableInTouchMode(true);

        viewLayoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        viewLayoutParams.weight = 1.0f;
        leftLinearLayout.setLayoutParams(viewLayoutParams); // 参数:宽、高、比重,比重为1.0
        rightLinearLayout.setLayoutParams(viewLayoutParams); // 参数:宽、高、比重,比重为1.0

        viewLayoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT;
        mainLinearLayout.setLayoutParams(viewLayoutParams);
        mainLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
    }

    /**
     * 设置整体控件的宽高度
     *
     * @param widthDp  宽度DP
     * @param heightDp 高度DP
     */
    public void setViewsLayoutParm(int widthDp, int heightDp) {
        LayoutParams viewLayoutParams = new LayoutParams(dip2px(context,
                widthDp), dip2px(context, heightDp));

        mainLinearLayout.setLayoutParams(viewLayoutParams);
    }

    /**
     * 设置按钮的宽高度
     *
     * @param widthDp  宽度DP
     * @param heightDp 高度DP
     */
    public void setButtonLayoutParm(int widthDp, int heightDp) {
        LayoutParams viewLayoutParams = new LayoutParams(dip2px(context,
                widthDp), dip2px(context, heightDp));

        addButton.setLayoutParams(viewLayoutParams);
        subButton.setLayoutParams(viewLayoutParams);
        leftLinearLayout.setLayoutParams(viewLayoutParams);
        rightLinearLayout.setLayoutParams(viewLayoutParams);
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    private int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    private int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     *
     * @param pxValue (DisplayMetrics类中属性scaledDensity)
     * @return
     */
    private int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值,保证文字大小不变
     *
     * @param spValue (DisplayMetrics类中属性scaledDensity)
     * @return
     */
    private int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    /**
     * 设置EditText视图和文本区域宽高
     */
    private void setTextWidthHeight() {
        // 设置视图最小宽度
        if (editTextMinimumWidth < 0) {
            editTextMinimumWidth = dip2px(context, 80f);
        }
        editText.setMinimumWidth(dip2px(context, editTextMinimumWidth));
        centerLinearLayout.setMinimumWidth(dip2px(context, editTextMinimumWidth));

        // 设置文本区域高度
        if (editTextHeight > 0) {
            if (editTextMinHeight >= 0 && editTextMinHeight > editTextHeight) {
                editTextHeight = editTextMinHeight;
            }
            editText.setHeight(dip2px(context, editTextHeight));
        }

        // 设置视图高度
        if (editTextLayoutHeight > 0) {
            if (editTextMinimumHeight > 0
                    && editTextMinimumHeight > editTextLayoutHeight) {
                editTextLayoutHeight = editTextMinimumHeight;
            }

            LayoutParams layoutParams = (LayoutParams) editText
                    .getLayoutParams();
            layoutParams.height = dip2px(context, editTextLayoutHeight);
            editText.setLayoutParams(layoutParams);
            centerLinearLayout.setLayoutParams(layoutParams);
        }

        // 设置视图宽度
        if (editTextLayoutWidth > 0) {
            if (editTextMinimumWidth > 0
                    && editTextMinimumWidth > editTextLayoutWidth) {
                editTextLayoutWidth = editTextMinimumWidth;
            }

            LayoutParams layoutParams = (LayoutParams) editText
                    .getLayoutParams();
            layoutParams.width = dip2px(context, editTextLayoutWidth);
            editText.setLayoutParams(layoutParams);
            centerLinearLayout.setLayoutParams(layoutParams);
        }
    }

    /**
     * 将子view放入linearlayout中
     */
    private void insertView() {
        mainLinearLayout.addView(leftLinearLayout, 0);
        mainLinearLayout.addView(centerLinearLayout, 1);
        mainLinearLayout.addView(rightLinearLayout, 2);

        leftLinearLayout.addView(subButton);
        centerLinearLayout.addView(editText);
        rightLinearLayout.addView(addButton);

        addView(mainLinearLayout); // 将整块视图添加进当前AddAndSubView中
    }

    /**
     * 设置editText中的值
     *
     * @param num
     */
    public void setNum(int num) {
        this.num = num;
        editText.setText(String.valueOf(num));
    }

    /**
     * 获取editText中的值
     *
     * @return
     */
    public int getNum() {
        if (editText.getText().toString() != null) {
            return Integer.parseInt(editText.getText().toString());
        } else {
            return 0;
        }
    }

    /**
     * 设置EditText视图的最小高度
     *
     * @paramm inimumWidth
     * EditText的最小高度,单位px
     */
    public void setEditTextMinimumWidth(int editTextMinimumWidth) {
        // 设置视图最小宽度
        if (editTextMinimumWidth > 0) {
            this.editTextMinimumWidth = editTextMinimumWidth;
            editText.setMinimumWidth(dip2px(context, editTextMinimumWidth));
        }

    }

    /**
     * 设置EditText视图的最小高度
     *
     * @param editTextMinimumHeight EditText视图的最小高度,单位:px
     */
    public void setEditTextMinimumHeight(int editTextMinimumHeight) {
        // 设置视图最小高度
        if (editTextMinimumHeight > 0) {
            this.editTextMinimumHeight = editTextMinimumHeight;
            editText.setMinimumHeight(dip2px(context, editTextMinimumHeight));
        }
    }

    /**
     * 设置EditText文本区域的最小高度
     *
     * @param editTextMinHeight EditText文本区域的最小高度,单位:px
     */
    public void setEditTextMinHeight(int editTextMinHeight) {
        // 设置文本区域最小高度
        if (editTextMinHeight > 0) {
            this.editTextMinHeight = editTextMinHeight;
            editText.setMinHeight(dip2px(context, editTextMinHeight));
        }
    }

    /**
     * 设置EditText文本区域的高度
     *
     * @param editTextHeight EditText文本区域的高度,单位:px
     */
    public void setEditTextHeight(int editTextHeight) {
        this.editTextHeight = editTextHeight;
        setTextWidthHeight();
    }

    /**
     * 设置EditText视图的宽度
     *
     * @param editTextLayoutWidth 设置EditText视图的宽度,单位px
     */
    public void setEditTextLayoutWidth(int editTextLayoutWidth) {
        this.editTextLayoutWidth = editTextLayoutWidth;
        setTextWidthHeight();
    }

    /**
     * 设置EditText视图的高度
     *
     * @param editTextLayoutHeight EditText视图的最小高度,单位px
     */
    public void setEditTextLayoutHeight(int editTextLayoutHeight) {
        this.editTextLayoutHeight = editTextLayoutHeight;
        setTextWidthHeight();
    }


    /**
     * 设置输入框中的字体大小
     *
     * @param spValue 字体大小SP
     */
    public void setTextSize(int spValue) {
        editText.setTextSize(spValue);
    }

    /**
     * 以Drawable形式 设置按钮背景图
     *
     * @param addBtnDrawable 加号背景图
     * @param subBtnDrawable 减号背景图
     */
    public void setButtonBgDrawable(Drawable addBtnDrawable,
                                    Drawable subBtnDrawable) {
        // 不推荐用setBackgroundDrawable,新API推荐用setBackground(在API 16中)
        addButton.setBackgroundDrawable(addBtnDrawable);
        subButton.setBackgroundDrawable(subBtnDrawable);
        addButton.setText("");
        subButton.setText("");
    }

    /**
     * 以资源Resource形式 设置按钮背景图
     *
     * @param addBtnResource 加号背景图
     * @param subBtnResource 减号背景图
     */
    public void setButtonBgResource(int addBtnResource, int subBtnResource) {
        addButton.setBackgroundResource(addBtnResource);
        subButton.setBackgroundResource(subBtnResource);
        addButton.setText("");
        subButton.setText("");
    }

    /**
     * 设置按钮背景色
     *
     * @param addBtnColor 加号背景色
     * @param subBtnColor 减号背景色
     */
    public void setButtonBgColor(int addBtnColor, int subBtnColor) {
        addButton.setBackgroundColor(addBtnColor);
        subButton.setBackgroundColor(subBtnColor);
    }

    /**
     * 设置EditText文本变化监听
     *
     * @param onNumChangeListener
     */
    public void setOnNumChangeListener(OnNumChangeListener onNumChangeListener) {
        this.onNumChangeListener = onNumChangeListener;
    }

    /**
     * 设置文本变化相关监听事件
     */
    private void setViewListener() {
        addButton.setOnClickListener(new OnButtonClickListener());
        subButton.setOnClickListener(new OnButtonClickListener());
        editText.addTextChangedListener(new OnTextChangeListener());
    }

    /**
     * 加减按钮事件监听器
     *
     * @author ZJJ
     */
    class OnButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            String numString = editText.getText().toString();
            if (numString == null || numString.equals("")) {
                num = 1;
                editText.setText("1");
            } else {
                if (v.getTag().equals("+")) {
                    if (++num < 1) // 先加,再判断
                    {
                        num--;
//                        Toast.makeText(context, "亲,数量至少为1哦~",
//                                Toast.LENGTH_SHORT).show();
                        editText.setText("1");
                    } else {
                        editText.setText(String.valueOf(num));

                        if (onNumChangeListener != null) {
                            onNumChangeListener.onNumChange(AddAndSubView.this,
                                    num);
                        }
                    }
                } else if (v.getTag().equals("-")) {
                    if (--num < 1) // 先减,再判断
                    {
                        num++;
//                        Toast.makeText(context, "亲,数量至少为1哦~",
//                                Toast.LENGTH_SHORT).show();
                        editText.setText("1");
                    } else {
                        editText.setText(String.valueOf(num));
                        if (onNumChangeListener != null) {
                            onNumChangeListener.onNumChange(AddAndSubView.this,
                                    num);
                        }
                    }
                }
            }
        }
    }

    /**
     * EditText输入变化事件监听器
     *
     * @author ZJJ
     */
    class OnTextChangeListener implements TextWatcher {

        @Override
        public void afterTextChanged(Editable s) {
            String numString = s.toString();
            if (numString == null || numString.equals("")) {
                num = 1;
                if (onNumChangeListener != null) {
                    onNumChangeListener.onNumChange(AddAndSubView.this, num);
                }
            } else {
                int numInt = Integer.parseInt(numString);
                if (numInt < 1) {
//                    Toast.makeText(context, "亲,数量至少为1哦~",
//                            Toast.LENGTH_SHORT).show();
                    editText.setText("1");
                } else {
                    // 设置EditText光标位置 为文本末端
                    editText.setSelection(editText.getText().toString()
                            .length());
                    num = numInt;
                    if (onNumChangeListener != null) {
                        onNumChangeListener
                                .onNumChange(AddAndSubView.this, num);
                    }
                }
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                                  int count) {

        }

    }

    public interface OnNumChangeListener {
        /**
         * 输入框中的数值改变事件
         *
         * @param view 整个AddAndSubView
         * @param num  输入框的数值
         */
        public void onNumChange(View view, int num);
    }

}

4.效果图



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值