全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详谈自定义View之GridView单选 金额选择Layout-ChooseMoneyLayout

思路:

外层控件用的是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小时内与您取得联系。