ListView实现购物车功能包含单选与多选和修改数量
2016-01-22 16:14
459 查看
本来认为应该很容易,直接一个listview就能搞定了,但是写着写着就发现了问题,在listview中嵌入edittext时,点击条目编辑EditText时焦点会对不上, 点了此条目的edittext输入的东西却不显示在这个listview条目中,所以需要手动设置焦点,并且需要记得下点击的条目的postition,通过给条目设置ontouch事件来记录postition,然后通过对比postition来设置edittext的焦点,从而达到目的,最主要的代码是在adapter的getview中记录下postition。
1.activity
2.adapter
3.自定义加减可输入数量控件
4.效果图
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.效果图
相关文章推荐
- unity3D的FingerGestures插件
- webrtct: talky, OTALK,web4 基于webrtc的 即使通讯 开源代码!
- Android 4.0 WIFI初始化与启动流程
- MFC启动过程&单文档MFC程序的启动详细过程
- ScrollView和ViewPager嵌套的问题
- 剖析产品 找准用户 做个创业“老炮儿” --司马亮创业回忆录(二)
- zookeeper以及kafka环境的搭建
- channel --通道
- centos6.0下搭建LNMP环境
- h5中 <!DOCTYPE html>标签问题,div里面如果装有一个img下边会有2px间隙
- 最大公约数与最小公倍数(c语言)
- vsftpd 虚拟用户 530 Login incorrect 错误
- Codeforces Round #336 (Div. 2) D. Zuma(区间dp)
- 建造者模式(Builder Pattern)
- Apache+Tomcat集群配置
- Asp.Net WebApi 启用CORS跨域访问指定多个域名
- Ionic在Android上部署app步骤
- 值传递与引用传递的差别
- Android AsyncTask详解,你真的了解AsyncTask?
- linux中中解决vsftp连接时的“500 OOPS:cannot change directory:/root”