最近做一个商品购物车发现的问题

本贴最后更新于 3132 天前,其中的信息可能已经时异事殊

不说其他的先看图

                                          购物车的商品数量加减

这是我引用网友的一个类做的,看看这个类

package com.example.car_demo;

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 {
static Context context;
LinearLayout mainLinearLayout; // 主 View,即 AddAndSubView
LinearLayout leftLinearLayout; // 内部左 view
LinearLayout centerLinearLayout; // 中间 view
LinearLayout rightLinearLayout; // 内部右 view
OnNumChangeListener onNumChangeListener;
Button addButton;
Button subButton;
static EditText editText;
public static int num; // editText 中的数值
int editTextLayoutWidth; // editText 视图的宽度
int editTextLayoutHeight; // editText 视图的宽度
int editTextMinimumWidth; // editText 视图的最小宽度
int editTextMinimumHeight; // editText 视图的最小高度
int editTextMinHeight; // editText 文本区域的最小高度
int editTextHeight; // editText 文本区域的高度
public AddAndSubView(Context context) {
super(context);
this.context = context;
this.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();
	setButtonLayoutParm(40, 40);// 设置按钮的宽高
}

/**
 * 初始化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);
	editText.setTag("edit");

	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
 * @param fontScale
 *            (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
 * @param fontScale
 *            (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);
	mainLinearLayout.setTag("main");;
	leftLinearLayout.addView(addButton);
	centerLinearLayout.setTag("center");
	centerLinearLayout.addView(editText);
	rightLinearLayout.addView(subButton);

	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视图的最小高度
 * 
 * @param minimumWidth
 *            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);
}   

}

布局文件中引用它:

布局文件

activity里设置监听事件:

布局文件监听

这个看起来没什么问题,在主线程中执行是可以的。但是当我们没有在activity里加载这个类时就报错了,如在适配器adapter中,加载这个类时,就出现后台数值随着button的加减而变化。但在主界面上显示的值还是初始值。没有改变。

好吧,这种情况可以用

adapter.notifyDataSetChanged();

这句代码来刷新ui。但当传值给adapter的数据不是单单的edittext的时候,像list的集合对象时 ,edittext变了但是集合中传的数却没变。那么在主界面中的edittext是不能被刷新的。除非在adapter写个类似与接口的方法让activity调用才行。

 

那么问题来了。搞了这么多你不嫌麻烦吗?还是规规矩矩的写原生的吧!

 初入江湖的安卓小生 :阿秀                                                                                

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 19 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
idxiu
show me the code, change the world! 北京

推荐标签 标签

  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 609 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 4 关注
  • 安装

    你若安好,便是晴天。

    131 引用 • 1184 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1234 回帖 • 442 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 131 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 533 回帖 • 735 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 30 关注
  • 分享

    有什么新发现就分享给大家吧!

    245 引用 • 1776 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    16 引用 • 7 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 429 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    5 引用 • 62 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 7 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 646 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 9 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 237 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 20 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1398 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 4 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    165 引用 • 1474 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 2 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 523 关注