您的位置:首页 > 其它

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

2016-01-22 16:14 459 查看
本来认为应该很容易,直接一个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.效果图





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: