这两天做东西要用到伸缩菜单,倒腾了两天 终于出来了,分享一下:
1.布局文件shop_info_layout.xml:
<ExpandableListView android:id="@+id/shop_tests" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="none" ></ExpandableListView> xml中声明一个ExpandableListView
2.ExpandableListView 一级列表布局shop_product_item_layout.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="40dp" android:gravity="center" > <TextView android:id="@+id/shop_product_name" style="@style/TextStyle3" android:gravity="center" android:textColor="#000" android:layout_marginLeft="5dp" /> <TextView android:id="@+id/shop_yuan" style="@style/TextStyle3" android:layout_alignParentRight="true" android:textColor="#000" android:layout_marginRight="5dp" android:layout_alignBaseline="@+id/shop_product_name" android:text="元"/> <TextView android:id="@+id/shop_productprice" style="@style/TextStyle3" android:textColor="#E96C14" android:layout_alignBaseline="@+id/shop_product_name" android:layout_toLeftOf="@+id/shop_yuan" /> </RelativeLayout>
3.每个一级item下的二级信息布局shop_product_attr_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/shop_attrlist" android:orientation="horizontal" > <TextView android:id="@+id/shop_product_attrone" style="@style/TextStyle3" android:textColor="#000" android:textSize="14sp" android:layout_marginLeft="5dp" /> <TextView android:id="@+id/shop_product_attrtwo" android:textColor="#000" style="@style/TextStyle3" android:layout_marginLeft="15dp" android:textSize="14sp" /> <TextView android:id="@+id/shop_product_attrprice" android:textColor="#FD6F0C" style="@style/TextStyle3" android:layout_marginLeft="20dp" /> <TextView android:id="@+id/shop_product_yuan" style="@style/TextStyle3" android:textColor="#000" android:textSize="14sp" android:text="元"/> <ImageView android:id="@+id/shop_product_attrcart" android:layout_width="35dp" android:layout_height="35dp" android:background="@drawable/shop_purchase_cart" android:layout_marginLeft="15dp"/> </LinearLayout>
布局文件中用到的 style="@style/TextStyle3":
<style name="TextStyle3"> <item name="android:textSize">16sp</item> <item name="android:textColor">#fff</item> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> </style>
4.定义ExpandableAdapter:
import java.util.List; import java.util.Map; import com.zline.app.avtivity.R; import com.zline.app.entity.Product; import com.zline.app.entity.ProductAttr; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class ExpandableAdapter extends BaseExpandableListAdapter{ private Context context; private List<Product> productList; private Map<Integer, List<ProductAttr>> attrMap; private LayoutInflater layoutInflater; public ExpandableAdapter(Context context,List<Product> productList,Map<Integer, List<ProductAttr>> attrMap){ this.attrMap = attrMap; this.productList = productList; this.context = context; } @Override public Object getChild(int parentPosition, int childPosition) { return attrMap.get(productList.get(parentPosition).getProductId()); } @Override public long getChildId(int parentPosition, int childPosition) { return childPosition; } @Override public View getChildView(int parentPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { Holder holder; if(convertView==null){ layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout layout = (LinearLayout) layoutInflater.from(context).inflate(R.layout.shop_product_attr_layout, null); convertView = layout; holder = new Holder(); holder.attrOne = (TextView) convertView.findViewById(R.id.shop_product_attrone); holder.attrOne.setText(attrMap.get(productList.get(parentPosition).getProductId()).get(childPosition).getDictOne()); holder.attrTwo = (TextView) convertView.findViewById(R.id.shop_product_attrtwo); holder.attrTwo.setText(attrMap.get(productList.get(parentPosition).getProductId()).get(childPosition).getDictTwo()); holder.price = (TextView) convertView.findViewById(R.id.shop_product_attrprice); holder.price.setText(attrMap.get(productList.get(parentPosition).getProductId()).get(childPosition).getPrice()+""); convertView.setTag(holder); }else{ holder = (Holder) convertView.getTag(); } return convertView; } @Override public int getChildrenCount(int parentPosition) { return attrMap.get(productList.get(parentPosition).getProductId()).size(); } @Override public Object getGroup(int parentPosition) { return productList.get(parentPosition); } @Override public int getGroupCount() { return productList.size(); } @Override public long getGroupId(int parentPosition) { return parentPosition; } @Override public View getGroupView(int parentPosition, boolean isExpanded, View convertView, ViewGroup parent) { layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); RelativeLayout relativeLayout = (RelativeLayout) layoutInflater.inflate(R.layout.shop_product_item_layout, null); TextView productName = (TextView) relativeLayout.findViewById(R.id.shop_product_name); productName.setText(productList.get(parentPosition).getProductName()); TextView priceRange = (TextView) relativeLayout.findViewById(R.id.shop_productprice); priceRange.setText(productList.get(parentPosition).getPriceRange()); return relativeLayout; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int arg0, int arg1) { return true; } public boolean isEmpty() { return false; } public void onGroupExpanded(int groupPosition) { int a = getChildrenCount(groupPosition); if (a == 0) { Toast.makeText(context, "该组下没有数据!", Toast.LENGTH_LONG).show(); } } public void onGroupCollapsed(int groupPosition) { Log.i("GFEDCBA", "我被折叠了!"); } static class Holder{ TextView attrOne; TextView attrTwo; TextView price; }
5.activity:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.zline.app.entity.Product; import com.zline.app.entity.ProductAttr; import com.zline.app.myclass.shop.ExpandableAdapter; import com.zline.app.myclass.shop.GalleryAdapter; import android.os.Bundle; import android.view.Window; import android.widget.ExpandableListView; import android.widget.Gallery; import android.widget.ImageView; import android.widget.ListView; import android.widget.RatingBar; import android.widget.RatingBar.OnRatingBarChangeListener; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; @SuppressWarnings("deprecation") public class ShopInfoActivity extends Activity { List<Product> products; Map<Integer, List<ProductAttr>> productAttrs; ExpandableListView expandableListView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.shop_info_layout); createProduct(); createAttr(); initView(); } //初始化各个组件 private void initView(){ expandableListView = (ExpandableListView) findViewById(R.id.shop_tests); ExpandableAdapter expandableAdapter = new ExpandableAdapter(this, products, productAttrs); expandableListView.setAdapter(expandableAdapter); } private List<Map<String, Object>> createAttrs(){ attrList = new ArrayList<Map<String,Object>>(); for(int i=0;i<2;i++){ Map<String, Object> m = new HashMap<String, Object>(); m.put(ConstantDef.PRODUTC_ATTR_ONE, "规格:半只"); m.put(ConstantDef.PRODUCT_ATTR_TWO, "口味:纯香"); m.put(ConstantDef.PRODUCT_ATTR_PRICE, 38.0); attrList.add(m); } return attrList; }*/ private List<Product> createProduct(){ products = new ArrayList<Product>(); for(int i=0;i<4;i++){ Product p = new Product(); p.setPriceRange("29-32"); p.setProductName("港式叉烧饭"); p.setProductId(i+1); products.add(p); } return products; } private Map<Integer, List<ProductAttr>> createAttr(){ productAttrs = new HashMap<Integer, List<ProductAttr>>(); // List<ProductAttr> for(Product p:products){ List<ProductAttr> attrs = productAttrs.get(p.getProductId()); if(attrs == null){ attrs = new ArrayList<ProductAttr>(); ProductAttr attr = new ProductAttr(); attr.setDictOne("规格:半只"); attr.setDictTwo("风味:纯香"); attr.setPrice(28); attr.setProductId(p.getProductId()); attr.setAttrId(products.indexOf(p)); attrs.add(attr); attrs.add(attr); productAttrs.put(p.getProductId(), attrs); }else{ ProductAttr attr = new ProductAttr(); attr.setDictOne("规格:半只"); attr.setDictTwo("风味:纯香"); attr.setPrice(28); attr.setProductId(p.getProductId()); attr.setAttrId(products.indexOf(p)); attrs.add(attr); attrs.add(attr); productAttrs.put(p.getProductId(), attrs); } } return productAttrs; }
效果看附件。
参考文献:http://blog.csdn.net/luck_apple/article/details/6742018
http://wenku.baidu.com/view/f6ec17265901020207409c36.html
http://blog.csdn.net/jianghuiquan/article/details/8350550
相关推荐
总之,三级伸缩列表在Android开发中是一种强大的工具,通过理解其工作原理,定制适配器,优化性能,可以创建出功能强大且用户体验良好的层级数据展示界面。这个压缩包文件"ExpandableListView"可能包含了实现三级...
在Android开发中,ExpandableListView是一种常见的视图组件,它允许用户展示可展开和折叠的分组数据。然而,标准的ExpandableListView是垂直布局的,对于需要横向展示的场景,我们可能需要对其进行定制。标题...
这就是所谓的"android-listview列表伸缩自定义组件"。这个特性使得用户可以方便地查看和操作列表中的每个条目,并提供了一个优雅的方式来显示更多与列表项相关的详细信息。 首先,我们来理解一下这个功能的核心概念...
在Android开发中,`ExpandableListView`是一种常用的...通过合理的设计和编程实践,我们可以创建出高效且用户体验良好的多选伸缩列表。在实际项目中,开发者应根据具体需求灵活运用这些技术,确保功能的稳定性和性能。
`ExpandableListView`是Android SDK提供的一个视图类,专门用于展示可折叠的列表数据。它扩展了ListView,增加了群组和子项的概念,每个群组下可以包含多个子项。在这个特定的案例中,"二级Android可展开的列表"意味...
http://download.csdn.net/detail/chen_dl/8383145#comment这个是我上传的在github下载的库,库里没有告诉大家该怎么用,所以我上传了自己实现的demo.跟大家一起分享我的成果,这种折叠和展开的动画效果在国内的网站...
总的来说,"listView伸缩实现"项目提供了一个实用的ExpandableListView应用示例,可以帮助开发者理解并掌握如何在Android中实现列表的伸缩和二级展开功能。通过学习这个项目的源码,我们可以深入理解...
伸缩功能是通过使用ExpandableListView类实现的,它是ListView的一个子类,提供了扩展和折叠列表项的功能。每个可折叠的列表项(Group)可以包含一个或多个子项(Child)。当用户点击Group时,其对应的子项会以展开...
列表的伸缩扩展功能可能涉及到ExpandableListView或者自定义扩展效果,这种交互设计增加了用户体验的丰富性。 动态界面的实现可能包含了GridView或HorizontalScrollView等组件,用于展示多列或横向滑动的内容。仿58...
3. **ExpandableListView**:Android SDK中已经提供了一个名为ExpandableListView的控件,它支持子项的展开和折叠。不过,如果要实现"可以伸缩的ListView",我们可能需要自定义它的行为,或者结合普通的ListView和...
在Android应用开发中,创建一个类似QQ的分组列表框是一项常见的需求,它涉及到用户界面设计、数据结构处理以及自定义视图等技术。本文将深入解析如何利用Android_仿QQ分组列表框源码来实现这样的功能。 首先,我们...
手风琴列表(Accordion List)是一种用户界面设计模式,常用于呈现多级列表数据,它允许用户逐级展开和收起列表项,以显示或隐藏子级内容,类似音乐乐器手风琴的伸缩动作,因此得名。在Android平台上,实现手风琴...
在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。`ListView+头部可伸缩+item可分组`的主题涉及到对ListView的高级定制,以实现更丰富的交互效果和数据组织方式。这里我们将深入探讨如何实现...
标题“头部固定不动的listview”所指的就是这样一个功能:在`ListView`上方有一个可以伸缩的头部,而`ExpandableListView`的头部是固定的,不会随着列表的滚动而移动。 `ExpandableListView`是`ListView`的一个扩展...
程序的主框架是SlidingMenu+fragment,有四个子Fragment,首页分类点击有旋转木马的动画效果,PullScrollView,仿照的新浪微博Android客户端个人中心的ScrollView,下拉的时候有两种效果,一种是背景伸缩回弹效果,...
一个ExpandableListView的例子,实现多级菜单分类展示.rar 上传百度地图的基本定位操作应用.rar 两个GPS导航定位源码.rar 以圆心散开的半圆菜单.zip 仿 网易新闻客户端 滑动导航.zip 仿google play侧滑菜单.zip 仿...
《PinnedHeaderExpandableListView详解:打造固定头部与可伸缩功能的列表视图》 在Android开发中,我们常常需要处理数据展示的问题,而ExpandableListView作为一个强大的组件,能够帮助我们实现分组数据的展示,...
本项目"Android高级应用源码-自己做的手风琴效果 没有用折叠list 每个选项中 显示的是不同的list.zip"就是一种自制的手风琴效果,没有依赖折叠List(android.widget.ExpandableListView)这一常见的实现方式。...
在Android开发中,`ExpandListView`是一个非常实用的控件,它允许用户展开或收缩列表项,以此来显示或隐藏更多的子项内容。这个控件为用户提供了更丰富的交互体验,尤其是在展示层次结构数据时。标题"可展开可收缩的...