Android 仿淘宝商品属性标签页

需求

1.动态加载属性,如尺码,颜色,款式等

  由于每件商品的属性是不确定的,有的商品的属性是颜色和尺码,有的是口味,有的是大小,所以这些属性不能直接写死到页面上。

2.动态加载属性下的标签

  每个属性下的标签个数也不是一定的,比如有的商品的尺码是是S,M,XL,有的是均码,也就是每种属性的具体的内容是不一定的。

技术点

自定义ViewGroup,使其中的TextView可以依据内容长短自动换行,如下图所示

实现

布局

通过ListView来显示商品所有属性,每种属性作为ListView的Item。

<span style="font-family: Arial, Verdana, sans-serif;">自定义ViewGroup</span>

普通的LinearLayout只能横向和纵向显示控件,但是当一行显示不够时,无法自动换行,需要我们自定义布局容器。

<code class="hljs java">package jczb.shoping.common;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
public class MyViewGroup extends ViewGroup {
  private final static int VIEW_MARGIN=15;
  public MyViewGroup(Context context, AttributeSet attrs){
   super(context, attrs);
  }
  public MyViewGroup(Context context) {
   super(context);
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int stages = 1;
  int stageHeight = 0;
  int stageWidth = 0;
  int wholeWidth = MeasureSpec.getSize(widthMeasureSpec);
  for (int i = 0; i < getChildCount(); i++) {
   final View child = getChildAt(i);
   // measure
   measureChild(child, widthMeasureSpec, heightMeasureSpec);
   stageWidth += (child.getMeasuredWidth() + VIEW_MARGIN);
   stageHeight = child.getMeasuredHeight();
   if (stageWidth >= wholeWidth) {
    stages++;
    //reset stageWidth
    stageWidth = child.getMeasuredWidth();
   }
  }
  int wholeHeight = (stageHeight + VIEW_MARGIN) * stages;
  // report this final dimension
  setMeasuredDimension(resolveSize(wholeWidth, widthMeasureSpec),
    resolveSize(wholeHeight, heightMeasureSpec));
  }
  private int jiange = 10;//按钮之间的间隔
  @Override
  protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
   final int count = getChildCount();
   int row=0;// which row lay you view relative to parent
   int lengthX=arg1 ; // right position of child relative to parent
   int lengthY=arg2; // bottom position of child relative to parent
   for(int i=0;i<count;i++){ final="" view="" child="this.getChildAt(i);" int="" width="child.getMeasuredWidth();" height="child.getMeasuredHeight();" if(i="=" 0){="" lengthx+="width+VIEW_MARGIN;//第一个的时候不需要加" }else{="" +jiange;="" 按钮之间的间隔="" }="" lengthy="row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2;" if="" it="" can't="" drawing="" on="" a="" same="" line="" ,="" skip="" to="" next="" if(lengthx="">arg3){
     lengthX=width+VIEW_MARGIN+arg1;
     row++;
     lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2;
    }
    child.layout(lengthX-width, lengthY-height, lengthX, lengthY);
   }
  }
}
</code>

ListView的Adapter

<code class="hljs java">package jczb.shoping.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import jczb.shoping.common.MyViewGroup;
import jczb.shoping.ui.R;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TableLayout;
import android.widget.TextView;
public class PropertyAdapter extends BaseAdapter {
 private Context mContext;
 private ArrayList<hashmap<string,object>> mList;
 private ArrayList<hashmap<string,textview[]>> mViewList;
 private Drawable drawableNormal ;
 private Drawable drawablePressed;
 private Handler mHandler;
 //用于保存用户的属性集合
 private HashMap<string,string> selectProMap=new HashMap<string, string="">();
 /**
  * 返回选中的属性
  * @return
  */
 public HashMap<string, string=""> getSelectProMap() {
  return selectProMap;
 }
 public void setSelectProMap(HashMap<string, string=""> selectProMap) {
  this.selectProMap = selectProMap;
 }
 public PropertyAdapter(Handler handler,Context context,ArrayList<hashmap<string,object>> list){
  super();
  this.mHandler=handler;
  this.mContext=context;
  this.mList=list;
  mViewList=new ArrayList<hashmap<string,textview[]>>();
  drawableNormal=mContext.getResources().getDrawable(R.drawable.tv_property_label);
 }
 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return mList.size();
 }
 @Override
 public Object getItem(int position) {
  // TODO Auto-generated method stub
  return mList.get(position);
 }
 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return position;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder = null;
  if (convertView == null) {
   // 获取list_item布局文件的视图
   convertView = LayoutInflater.from(this.mContext).inflate(R.layout.lv_property_item, null,true);
   holder = new ViewHolder();
   // 获取控件对象
   holder.tvPropName= (TextView) convertView
     .findViewById(R.id.tv_property_name);
   //holder.llPropContents=(LinearLayout)convertView.findViewById(R.id.ll_property_content);
   //holder.tlPropContents=(TableLayout)convertView.findViewById(R.id.ll_property_content);
   // 设置控件集到convertView
   holder.vgPropContents= (MyViewGroup) convertView.findViewById(R.id.myviewgroup);
   convertView.setTag(holder);
  } else {
   holder = (ViewHolder) convertView.getTag();
  }
  if (this.mList != null) {
   //HashMap<string,textview[]> mapView=new HashMap<string,>();
   ArrayList<string> lables = (ArrayList<string>) this.mList.get(position).get("lable");
   String type = (String) this.mList.get(position).get(
     "type");
   holder.tvPropName.setText(type);//规格名称
   //动态加载标签
   //判断布局中的子控件是否为0,如果不为0,就不添加了,防止ListView滚动时重复添加
   if(holder.vgPropContents.getChildCount()==0){
    TextView[] textViews = new TextView[lables.size()];
    //设置每个标签的文本和布局
    //TableRow tr=new TableRow(mContext);
     for (int i = 0; i < lables.size(); i++) {
      TextView textView = new TextView(mContext);      textView.setGravity(17);
      textView.setPadding(25,15,25,15);
      textViews[i] = textView;
      textViews[i].setBackgroundResource(R.drawable.tv_property_label);
      textViews[i].setText(lables.get(i));
      textViews[i].setTag(i);
      //textViews[i].setBackgroundColor(Color.parseColor("#EE5500"));
      //tr.addView(textViews[i]);
     // holder.llPropContents.addView(textViews[i]);
      holder.vgPropContents.addView(textViews[i]);
     }
     //holder.tlPropContents.addView(tr);
     //绑定标签的Click事件
     for(int j=0;j<textviews.length;j++){ string="" void="" viewholder="" view="" v="(TextView)" tv="(TextView)v;" this.type="type;" textviews="(TextView[])v.getTag();" textview="" tablelayout="" return="" public="" private="" override="" new="" myviewgroup="" linearlayout="" lableclicklistener="" int="" implements="" i="0;i<textViews.length;i++){" h="0;h<holder.vgPropContents.getChildCount();h++){" code=""></textviews.length;j++){></string></string></string,></string,textview[]></hashmap<string,textview[]></hashmap<string,object></string,></string,></string,></string,string></hashmap<string,textview[]></hashmap<string,object></code>

总结

  这里关键就是实现自定义的ViewGroup,重写onMeasure和onLayout方法,判断新添加的控件有没有超出屏幕的宽度来决定是否要换行。

以上所述是小编给大家介绍的Android 仿淘宝商品属性标签页,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android 仿京东、拼多多商品分类页的示例代码

    最近接了一个项目,要仿照京东写一个商品分类页,但需要滑动右边子分类,左边的主分类也跟着变换,写了个demo,需要的同学可以自取. 先放一个写完之后的样子: 写这个需求的思路也很清晰,首先左边肯定是一个listView,右边也是一个listView,这两个listView要达到一个联动的效果.右边的listView再嵌套一个GridView即可.如下图所示. 所以,我们需要的数据结构也就确定了,应该是数组套数组,也就说护肤大分类下又有子分类商品,类似于这个样子: ok,数据和UI结构确定了,就可以

  • Android实现商品展示效果

    一. 创建手机界面布局 创建一个activity_main.xml文件代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" androi

  • Android仿淘宝切换商品列表布局效果的示例代码

    最近电商项目中有这样一个需求,就是在进入商品列表界面,有一个按钮可以切换商品列表的布局(网格或者垂直列表排列). 效果图: 上面两幅图分别是点击右上角按钮后显示两种不同布局的效果.简单的流程可以概括为:第一次进入页面,有个默认的布局(网格布局),点击按钮,由网格布局切换到竖直的线性布局,再次点击切换到网格布局. 分析: 可以看到商品展示的形式都是以列表的方式来展现,我用的是RecyclerView,这种列表并不复杂,配合Adapter数据适配器就实现了. 提出这个需求时,问了朋友,他说使用了两个

  • 安卓(android)仿电商app商品详情页按钮浮动效果

    1.效果图如下: 这效果用户体验还是很酷炫,今天我们就来讲解如何实现这个效果. 2.分析 为了方便理解,作图分析 如图所示,整个页面分为四个部分: 1.悬浮内容,floatView 2.顶部内容,headView 3.中间内容,与悬浮内容相同,middleView 4.商品详情展示页面,detailView 因为页面内容高度会超出屏幕,所以用Scrollview实现滚动,悬浮view与scrollview同级,都在一个帧布局或者相对布局中. 当y方向的滚动距离小于中间的内容middleView到

  • Android仿京东、天猫商品详情页

    前言 前面在介绍控件TabLayout控件和CoordinatorLayout使用的时候说了下实现京东.天猫详情页面的效果,今天要说的是优化版,是我们线上实现的效果,首先看一张效果: 项目结构分析 首先我们来分析一下要实现上面的效果,我们需要怎么做.顶部是一个可以滑动切换Tab,可以用ViewPager+Fragment实现,也可以使用系统的TabLayout控件实现:而下面的 View是一个可以滑动拖动效果的View,可以采用网上一个叫做DragLayout的控件,我这里是自己实现了一个,主要

  • Android仿淘宝商品浏览界面图片滚动效果

    用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个ScrollView滚动到最底下时会有提示,继续拖动才能浏览图片.仿照这个效果写一个出来并不难,只要定义一个Layout管理两个ScrollView就行了,当第一个ScrollView滑到底部时,再次向上滑动进入第二个ScrollView.效果如下: 需要注意的地方是: 1.如果是手动滑到底部需要再次按下才能继续往下滑,自动滚动到底部则不需要 2.在由上一个ScrollView滑动到下一个ScrollView的过程中多只手指相继拖动也不会导

  • Android 仿淘宝商品属性标签页

    需求 1.动态加载属性,如尺码,颜色,款式等 由于每件商品的属性是不确定的,有的商品的属性是颜色和尺码,有的是口味,有的是大小,所以这些属性不能直接写死到页面上. 2.动态加载属性下的标签 每个属性下的标签个数也不是一定的,比如有的商品的尺码是是S,M,XL,有的是均码,也就是每种属性的具体的内容是不一定的. 技术点 自定义ViewGroup,使其中的TextView可以依据内容长短自动换行,如下图所示 实现 布局 通过ListView来显示商品所有属性,每种属性作为ListView的Item.

  • Android仿淘宝商品详情页效果

    本文实例为大家分享了Android仿淘宝商品详情页的具体代码,供大家参考,具体内容如下 Demo地址:先上效果图 效果就是上面图片的效果 接下来看看如何实现 首先我们来看下布局文件 <LinearLayout android:id="@+id/header" android:layout_width="match_parent" android:layout_height="72dp" android:paddingTop="24

  • Android仿淘宝商品详情页

    看到有人在问如何实现淘宝商品详情页效果,献上效果图 大致梳理一下思路,这里不提供源码 状态栏透明使用开源库StatusBarCompat,为了兼容手机4.4 dependencies { compile ('com.github.niorgai:StatusBarCompat:2.1.4', { exclude group: 'com.android.support' }) } allprojects { repositories { ... maven { url "https://jitpa

  • Android仿淘宝商品拖动查看详情及标题栏渐变功能

    绪论 最近一直比较忙,也没抽出时间来写博客,也不得不说是自己犯了懒癌,人要是一懒就什么事都不想做了,如果不能坚持下来的话,那么估计就废了,��.最近自己攒了好多东西,接下来的时间我会慢慢都分享出来的.好了废话不多说了,下面我们开始正题: 今天要分享的是淘宝的详情页,之前在淘宝上买东西的时候看到淘宝的详情页效果比较不错,所以今天就来仿一下它的效果吧,可能没有淘宝的好,希望见谅啊. 先上效果图: 这是淘宝的: 我自己做的: 怎么样效果还差不多吧?GIF图效果看的不太清楚,见谅. 下面我们来看看怎么实

  • Android实现淘宝商品列表切换效果

    本文实例为大家分享了Android仿淘宝商品列表切换,供大家参考,具体内容如下 源码:Android实现淘宝商品列表切换 布局文件 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.androi

  • Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解

    一.淘宝商品详情页效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="http:/

  • Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

    需要做一个仿淘宝客户端ViewPager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始没什么思路,后来搜了一下,发现有好几种实现方法,最好的一种就是在ViewPager图片的后面再加一个view,然后滑动viewpager的时候,判断一下就行了. 附一个链接,我写的代码就是参考的这个,稍微改了一点点,先看看效果图. 实现起来比较简单,先写一个滑动加载详情的布局,然后在viewpager的instantiateItem里面判断一下,如果是最后一张,就显示加载详情的那个布局.不过需要注意的是,v

  • Android仿淘宝view滑动至屏幕顶部会一直停留在顶部的位置

    在刚刚完成的项目中,在一个页面中,用户体验师提出引用户操作的入住按钮要一直保留在页面当中,不管页面能滚动多长都得停留在页面的可视区域.最终实现效果如下图所示:   如图中的红色框中的view始终会停留在页面中,如果滑动至页面的顶部,会一直保留在顶部. 下面来说下具体的实现思路: 思路:其实整个页面当中一共有两个视觉效果一样的View,通过滑动的位置来进行View的隐藏和显示来达到这种效果.整个页面的在上下滑动的过程中可以总结为两个状态,状态A(如图1所示),view2在可视区域内时,view1不

  • Android仿淘宝头条基于TextView实现上下滚动通知效果

    最近有个项目需要实现通知栏的上下滚动效果,仿淘宝头条的那种. 我从网上看了一些代码,把完整的效果做了出来.如图所示: 具体代码片段如下: 1.在res文件夹下新建anmin文件夹,在这个文件夹里创建两个文件 (1).anim_marquee_in.xml进入时动画 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/ap

随机推荐