
思路:
外层控件用的是GridView,里面每个item放一个FrameLayout,FrameLayout里面有Checkbox和ImageView,chechBox添加background实现选中效果,选中背景为透明,显示item的勾勾图标,不选中checkbox就有背景,挡住选中的勾勾。。重写GridView,实现监听和数据适配,用一个接口返回选中的数据。
代码:
ChooseMoneyLayout.java
public class ChooseMoneyLayout extends GridView {
private int[] moneyList = {}; //数据源
private LayoutInflater mInflater;
private MyAdapter adapter; //适配器
int defaultChoose = 0; //默认选中项
public ChooseMoneyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
setData();
}
public void setData() {
mInflater = LayoutInflater.from(getContext());
//配置适配器
adapter = new MyAdapter();
setAdapter(adapter);
}
/**
* 设置默认选择项目,
* @param defaultChoose
*/
public void setDefaultPositon(int defaultChoose) {
this.defaultChoose = defaultChoose;
adapter.notifyDataSetChanged();
}
/**
* 设置数据源
* @param moneyData
*/
public void setMoneyData(int[] moneyData){
this.moneyList = moneyData;
}
class MyAdapter extends BaseAdapter {
private CheckBox checkBox;
@Override
public int getCount() {
return moneyList.length;
}
@Override
public Object getItem(int position) {
return moneyList[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
MyViewHolder holder;
if (convertView == null) {
holder = new MyViewHolder();
convertView = mInflater.inflate(R.layout.item_money_pay, parent, false);
holder.moneyPayCb = (CheckBox) convertView.findViewById(R.id.money_pay_cb);
convertView.setTag(holder);
} else {
holder = (MyViewHolder) convertView.getTag();
}
holder.moneyPayCb.setText(getItem(position) + "元");
holder.moneyPayCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
//设置选中文字颜色
buttonView.setTextColor(getResources().getColor(R.color.light_color_blue));
//取消上一个选择
if (checkBox != null) {
checkBox.setChecked(false);
}
checkBox = (CheckBox) buttonView;
} else {
checkBox = null;
//设置不选中文字颜色
buttonView.setTextColor(getResources().getColor(R.color.darkgray));
}
//回调
listener.chooseMoney(position, isChecked, (Integer) getItem(position));
}
});
if (position == defaultChoose) {
defaultChoose = -1;
holder.moneyPayCb.setChecked(true);
checkBox = holder.moneyPayCb;
}
return convertView;
}
private class MyViewHolder {
private CheckBox moneyPayCb;
}
}
/**
* 解决嵌套显示不完
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
private onChoseMoneyListener listener;
public void setOnChoseMoneyListener(onChoseMoneyListener listener) {
this.listener = listener;
}
public interface onChoseMoneyListener {
/**
* 选择金额返回
*
* @param position gridView的位置
* @param isCheck 是否选中
* @param moneyNum 钱数
*/
void chooseMoney(int position, boolean isCheck, int moneyNum);
}
}
item_money_pay.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:descendantFocusability="blocksDescendants">
<!-- 选中时候的图片 -->
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_gravity="right|bottom"
android:layout_marginBottom="3dp"
android:layout_marginRight="3dp"
android:maxHeight="9dp"
android:maxWidth="9dp"
android:scaleType="fitCenter"
android:src="@drawable/money_pay_type_choose" />
<CheckBox
android:id="@+id/money_pay_cb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/money_pay_selector"
android:button="@null"
android:gravity="center"
android:paddingBottom="2.5dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="2.5dp"
android:textSize="20sp"
android:textColor="#ff777777"
/>
</FrameLayout>
CheckBox的background: money_pay_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/blue_border_noback_drawable"/>
<item android:state_selected="true" android:drawable="@drawable/blue_border_noback_drawable"/>
<item android:state_checked="true" android:drawable="@drawable/blue_border_noback_drawable"/>
<item >
<shape>
<solid android:color="#ffffffff"/>
<corners android:radius="5dp"/>
<stroke android:color="#ffbfbfbf"
android:width="1dp"/>
</shape>
</item>
</selector>
activity xml:
<com.minstone.view.ChooseMoneyLayout
android:id="@+id/money_chose_money"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:horizontalSpacing="17dp"
android:numColumns="3"
android:verticalSpacing="20dp" />
activity里面代码:
private ChooseMoneyLayout moneyChoseMoney;
private int money; //当前选择的金额
private void initData() {
//获取控件
moneyChoseMoney = (ChooseMoneyLayout)findViewById(R.id.money_chose_money);
//数设置据源
moneyChoseMoney.setMoneyData(new int[]{30, 50, 100, 200, 300, 500,1000});
//设置默认选中项
moneyChoseMoney.setDefaultPositon(3);
//金额选择监听
moneyChoseMoney.setOnChoseMoneyListener(new ChooseMoneyLayout.onChoseMoneyListener() {
@Override
public void chooseMoney(int position,boolean isCheck, int moneyNum) {
if(isCheck){
money = moneyNum;
ToastUtil.showCustomToast(PayActivity.this,money+"");
}else{
money = 0;
}
}
});
}
以上这篇详谈自定义View之GridView单选 金额选择Layout-ChooseMoneyLayout就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# android
# gridview单选
# Android利用GridView实现单选效果
# Android利用GridView实现单选功能
# 给大家
# 的是
# 就有
# 希望能
# 自定义
# 重写
# 这篇
# 不完
# 回调
# 小编
# 大家多多
# 单选
# null
# holder
# ViewGroup
# parent
# MyViewHolder
# inflate
# moneyPayCb
# findViewById
相关文章:
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
网站制作员失业,怎样查看自己网站的注册者?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
定制建站如何定义?其核心优势是什么?
建站之星代理平台如何选择最佳方案?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
宝塔建站无法访问?如何排查配置与端口问题?
如何高效利用200m空间完成建站?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
网站制作说明怎么写,简述网页设计的流程并说明原因?
广德云建站网站建设方案与建站流程优化指南
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何通过远程VPS快速搭建个人网站?
如何快速搭建二级域名独立网站?
济南网站制作的价格,历城一职专官方网站?
如何配置WinSCP新建站点的密钥验证步骤?
宿州网站制作公司兴策,安徽省低保查询网站?
建站之星代理如何获取技术支持?
智能起名网站制作软件有哪些,制作logo的软件?
测试制作网站有哪些,测试性取向的权威测试或者网站?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
在线制作视频网站免费,都有哪些好的动漫网站?
网站制作网站,深圳做网站哪家比较好?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
,柠檬视频怎样兑换vip?
如何在Golang中指定模块版本_使用go.mod控制版本号
黑客入侵网站服务器的常见手法有哪些?
如何用腾讯建站主机快速创建免费网站?
,怎么用自己头像做动态表情包?
,sp开头的版面叫什么?
如何通过FTP服务器快速搭建网站?
音响网站制作视频教程,隆霸音响官方网站?
如何在阿里云高效完成企业建站全流程?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
网站制作费用多少钱,一个网站的运营,需要哪些费用?
Python路径拼接规范_跨平台处理说明【指导】
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
网站制作的步骤包括,正确网址格式怎么写?
宝塔新建站点报错如何解决?
如何通过VPS建站无需域名直接访问?
如何通过建站之星自助学习解决操作问题?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
建站之星图片链接生成指南:自助建站与智能设计教程
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何在IIS管理器中快速创建并配置网站?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。