- 浏览: 43527 次
- 性别:
- 来自: 济南
文章分类
最新评论
大家看到这样的需求时,可能首先就会想到,拿两个咱们最熟悉不过的两个ListView来实现就可以解决问题了。就是分为两层,内层与外层。(即嵌套listview的使用)
可是事情有的时候并不是你想的那样的,是的,android布局上面可以实现,我起初的想法也是以listview的嵌套使用的,可是在实施的过程中,出现了一些问题,今天就一起来分享一下怎么实现,与解决这一类的问题。也当作是给自己的一个项目记录吧。
为方便,我就将listview分为两个,一个是listview_in (内层)与listview_out(外层)
外层的listview_out 布局如下所示:
<!-- 此次订单详细列表 -->
<ListView
android:id="@+id/list_item"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_below="@id/first_linear"
android:layout_above="@id/bottom"
style="@style/mylistview_style">
</ListView>
其填充条目的View是一个自定义的View----->order_item_complete_view
/**
* 按照商家进行分组的订单视图
* @author wsf
*
*/
public class order_item_complete_view implements IBaseView {
private View myview;
private ShopModel myshopModel;
private Context mycontext;
private DG_ListView mylistview;
private order_cplt_adapter adapter;
private TextView res_name;
private TextView total;
public order_item_complete_view(Context context,ShopModel shopmodel) {
// TODO Auto-generated constructor stub
mycontext=context;
myshopModel=shopmodel;
adapter=new order_cplt_adapter(mycontext, shopmodel.getList_ordered());
InitView();
}
private void InitView() {
// TODO Auto-generated method stub
myview=LayoutInflater.from(mycontext).inflate(R.layout.order_item_complete_view, null);
mylistview=(DG_ListView)myview.findViewById(R.id.list_item);
mylistview.setAdapter(adapter);
res_name=(TextView)myview.findViewById(R.id.res_name);
total=(TextView)myview.findViewById(R.id.total_spend);
res_name.setText(myshopModel.getName());
total.setText(myshopModel.getTotal()+"");
}
@Override
public View getView() {
// TODO Auto-generated method stub
return myview;
}
}
而在这个视图中,也有一个listview,这个就是我们的重头戏了,这个listview是我们自定义的DG_ListView
public class DG_ListView extends ListView {
public DG_ListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public DG_ListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public DG_ListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
这个listview所使用的条目视图布局如下所示;
(order_item_complete_view.xml)布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" ><!--内层的最外部需要是linearlayout ,如果不是会报错,比如说是realativelayout,因为其没有omeasure方法-->
<!-- title -->
<TextView
android:id="@+id/res_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/menu_name" />
<!-- 列表 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<com.doget.dingsong.wekit.DG_ListView
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.doget.dingsong.wekit.DG_ListView>
</LinearLayout>
<!-- bottom -->
<RelativeLayout
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="@dimen/twenty"
android:layout_alignParentBottom="true" >
<TextView
android:id="@+id/total_spend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="@string/total" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
内部listview的适配器 order_cplt_adapter
public class order_cplt_adapter extends baseMyAdapter<OrderItemModel> {
public order_cplt_adapter(Context context,List<OrderItemModel> lists)
{
mycontext=context;
mylist=lists;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder vh=null;
OrderItemModel m=mylist.get(position);
if(convertView==null)
{
convertView=LayoutInflater.from(mycontext).inflate(R.layout.order_item_complete, null);
vh=new ViewHolder();
vh.count_order=(TextView)convertView.findViewById(R.id.count_order);
vh.price_order=(TextView)convertView.findViewById(R.id.price_order);
vh.food_name_order=(TextView)convertView.findViewById(R.id.food_name_order);
vh.icon_order=(DG_ImageView)convertView.findViewById(R.id.icon_order);
convertView.setTag(vh);
}
else
{
vh=(ViewHolder)convertView.getTag();
}
vh.icon_order.setImage(m.getImgUrl());
vh.food_name_order.setText(m.getOrder_name());
vh.price_order.setText(m.getPrice()+"");
vh.count_order.setText(m.getOrder_count()+"");
vh.icon_order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(mycontext, "点击我了哦!!!", 1000).show();
}
});
return convertView;
}
class ViewHolder
{
DG_ImageView icon_order;
TextView food_name_order;
TextView price_order;
TextView count_order;
}
}
一些数据结构,大家可以自己组织一下.以上就是内部的listview已经完成.
那么,实现嵌套的话,外部调用内部视图,最重要的是改写外部的适配器.
外部的适配器如下所示:
order_from_adapter
public class order_from_adapter extends baseMyAdapter<ShopModel> {
public order_from_adapter(Context context,List<ShopModel> lists)
{
mycontext=context;
mylist=lists;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
order_item_complete_view v=null;
if(convertView==null)
{
v=new order_item_complete_view(mycontext, mylist.get(position));
convertView=v.getView();
convertView.setTag(v.getView());
}
else
{
v=new order_item_complete_view(mycontext, mylist.get(position));
convertView=v.getView();
}
return convertView;
}
}
两个listview实现的交互,调用方法。
public class order_form_act extends AbActivity {
OrderFormModel m=new OrderFormModel();
order_from_adapter adapter;
order_cplt_adapter adapter_2;
ListView list_item;
//用户相关信息
TextView username;
TextView Address;
TextView Credit_card;
TextView coupon;
Button btn_order_his;
Button btn_check_sheet;
public order_form_act() {
// TODO Auto-generated constructor stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setAbContentView(R.layout.order_form_act);
getTitleBar().setVisibility(View.GONE);
list_item=(ListView)findViewById(R.id.list_item);
username=(TextView)findViewById(R.id.username);
Address=(TextView)findViewById(R.id.Address);
Credit_card=(TextView)findViewById(R.id.Credit_card);
coupon=(TextView)findViewById(R.id.coupon);
initData();
}
public void initData()
{
List<ShopModel> shops=new ArrayList<ShopModel>();
for(int i=0;i<4;i++)
{
List<OrderItemModel> ods=new ArrayList<OrderItemModel>();
for(int j=0;j<5;j++)
{
OrderItemModel od=new OrderItemModel(j+"", "order--->"+j, i+"", j, "2013-11-12 11:35 PM",3,getString(R.string.img_src_1));
ods.add(od);
}
ShopModel sp=new ShopModel(i, i+"", getString(R.string.img_src_1), "东方饺子", ods);
shops.add(sp);
}
m=new OrderFormModel("wsf", "望京西街融科橄榄城西区", 12.3f, 2, 3, "2013-11-7 12:33", shops, 4f);
adapter=new order_from_adapter(order_form_act.this,shops);
adapter_2=new order_cplt_adapter(order_form_act.this, m.getShop_ordered().get(0).getList_ordered());
list_item.setAdapter(adapter);
username.setText(m.getCustomer_name());
Address.setText(m.getAddress());
Credit_card.setText(m.getCreditcard()+"");
coupon.setText(m.getCoupon_count()+"");
}
可是事情有的时候并不是你想的那样的,是的,android布局上面可以实现,我起初的想法也是以listview的嵌套使用的,可是在实施的过程中,出现了一些问题,今天就一起来分享一下怎么实现,与解决这一类的问题。也当作是给自己的一个项目记录吧。
为方便,我就将listview分为两个,一个是listview_in (内层)与listview_out(外层)
外层的listview_out 布局如下所示:
<!-- 此次订单详细列表 -->
<ListView
android:id="@+id/list_item"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_below="@id/first_linear"
android:layout_above="@id/bottom"
style="@style/mylistview_style">
</ListView>
其填充条目的View是一个自定义的View----->order_item_complete_view
/**
* 按照商家进行分组的订单视图
* @author wsf
*
*/
public class order_item_complete_view implements IBaseView {
private View myview;
private ShopModel myshopModel;
private Context mycontext;
private DG_ListView mylistview;
private order_cplt_adapter adapter;
private TextView res_name;
private TextView total;
public order_item_complete_view(Context context,ShopModel shopmodel) {
// TODO Auto-generated constructor stub
mycontext=context;
myshopModel=shopmodel;
adapter=new order_cplt_adapter(mycontext, shopmodel.getList_ordered());
InitView();
}
private void InitView() {
// TODO Auto-generated method stub
myview=LayoutInflater.from(mycontext).inflate(R.layout.order_item_complete_view, null);
mylistview=(DG_ListView)myview.findViewById(R.id.list_item);
mylistview.setAdapter(adapter);
res_name=(TextView)myview.findViewById(R.id.res_name);
total=(TextView)myview.findViewById(R.id.total_spend);
res_name.setText(myshopModel.getName());
total.setText(myshopModel.getTotal()+"");
}
@Override
public View getView() {
// TODO Auto-generated method stub
return myview;
}
}
而在这个视图中,也有一个listview,这个就是我们的重头戏了,这个listview是我们自定义的DG_ListView
public class DG_ListView extends ListView {
public DG_ListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public DG_ListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public DG_ListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
这个listview所使用的条目视图布局如下所示;
(order_item_complete_view.xml)布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" ><!--内层的最外部需要是linearlayout ,如果不是会报错,比如说是realativelayout,因为其没有omeasure方法-->
<!-- title -->
<TextView
android:id="@+id/res_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/menu_name" />
<!-- 列表 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<com.doget.dingsong.wekit.DG_ListView
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.doget.dingsong.wekit.DG_ListView>
</LinearLayout>
<!-- bottom -->
<RelativeLayout
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="@dimen/twenty"
android:layout_alignParentBottom="true" >
<TextView
android:id="@+id/total_spend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="@string/total" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
内部listview的适配器 order_cplt_adapter
public class order_cplt_adapter extends baseMyAdapter<OrderItemModel> {
public order_cplt_adapter(Context context,List<OrderItemModel> lists)
{
mycontext=context;
mylist=lists;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder vh=null;
OrderItemModel m=mylist.get(position);
if(convertView==null)
{
convertView=LayoutInflater.from(mycontext).inflate(R.layout.order_item_complete, null);
vh=new ViewHolder();
vh.count_order=(TextView)convertView.findViewById(R.id.count_order);
vh.price_order=(TextView)convertView.findViewById(R.id.price_order);
vh.food_name_order=(TextView)convertView.findViewById(R.id.food_name_order);
vh.icon_order=(DG_ImageView)convertView.findViewById(R.id.icon_order);
convertView.setTag(vh);
}
else
{
vh=(ViewHolder)convertView.getTag();
}
vh.icon_order.setImage(m.getImgUrl());
vh.food_name_order.setText(m.getOrder_name());
vh.price_order.setText(m.getPrice()+"");
vh.count_order.setText(m.getOrder_count()+"");
vh.icon_order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(mycontext, "点击我了哦!!!", 1000).show();
}
});
return convertView;
}
class ViewHolder
{
DG_ImageView icon_order;
TextView food_name_order;
TextView price_order;
TextView count_order;
}
}
一些数据结构,大家可以自己组织一下.以上就是内部的listview已经完成.
那么,实现嵌套的话,外部调用内部视图,最重要的是改写外部的适配器.
外部的适配器如下所示:
order_from_adapter
public class order_from_adapter extends baseMyAdapter<ShopModel> {
public order_from_adapter(Context context,List<ShopModel> lists)
{
mycontext=context;
mylist=lists;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
order_item_complete_view v=null;
if(convertView==null)
{
v=new order_item_complete_view(mycontext, mylist.get(position));
convertView=v.getView();
convertView.setTag(v.getView());
}
else
{
v=new order_item_complete_view(mycontext, mylist.get(position));
convertView=v.getView();
}
return convertView;
}
}
两个listview实现的交互,调用方法。
public class order_form_act extends AbActivity {
OrderFormModel m=new OrderFormModel();
order_from_adapter adapter;
order_cplt_adapter adapter_2;
ListView list_item;
//用户相关信息
TextView username;
TextView Address;
TextView Credit_card;
TextView coupon;
Button btn_order_his;
Button btn_check_sheet;
public order_form_act() {
// TODO Auto-generated constructor stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setAbContentView(R.layout.order_form_act);
getTitleBar().setVisibility(View.GONE);
list_item=(ListView)findViewById(R.id.list_item);
username=(TextView)findViewById(R.id.username);
Address=(TextView)findViewById(R.id.Address);
Credit_card=(TextView)findViewById(R.id.Credit_card);
coupon=(TextView)findViewById(R.id.coupon);
initData();
}
public void initData()
{
List<ShopModel> shops=new ArrayList<ShopModel>();
for(int i=0;i<4;i++)
{
List<OrderItemModel> ods=new ArrayList<OrderItemModel>();
for(int j=0;j<5;j++)
{
OrderItemModel od=new OrderItemModel(j+"", "order--->"+j, i+"", j, "2013-11-12 11:35 PM",3,getString(R.string.img_src_1));
ods.add(od);
}
ShopModel sp=new ShopModel(i, i+"", getString(R.string.img_src_1), "东方饺子", ods);
shops.add(sp);
}
m=new OrderFormModel("wsf", "望京西街融科橄榄城西区", 12.3f, 2, 3, "2013-11-7 12:33", shops, 4f);
adapter=new order_from_adapter(order_form_act.this,shops);
adapter_2=new order_cplt_adapter(order_form_act.this, m.getShop_ordered().get(0).getList_ordered());
list_item.setAdapter(adapter);
username.setText(m.getCustomer_name());
Address.setText(m.getAddress());
Credit_card.setText(m.getCreditcard()+"");
coupon.setText(m.getCoupon_count()+"");
}
发表评论
-
android shap 各种图形自定义
2018-10-19 15:41 735shape标签能定义多少种类型的Drawable? sh ... -
添加屏保解锁功能
2018-10-19 15:43 983[size=x-large]1. 系统设置,执行LockPat ... -
android 动态加载sdcard jar的方法
2016-12-13 17:19 9291.新建Android工程,封装功能java类。 2.选中需要 ... -
android6.0单独编译和调试framework源码的方法
2016-11-29 20:35 0缺省情况下,Android 6.0的编译过程会优化framew ... -
adb 下面sqlite3 操作数据库
2016-06-16 10:52 01. adb 连接上设备进入后 ... -
ViewPaper
2016-03-02 10:13 0ViewPape ... -
ssh 别名登录小技巧
2016-02-22 10:52 0vim ~/.ssh/config Host carte ... -
ssh 免密码登录设置
2016-02-22 10:51 0配置SSH无密码登录需要3步: 1.生成公钥和私钥 ... -
Git 的origin和master分析 push/diff/head
2016-02-16 14:51 0[size=large][size=large] 1、ori ...
相关推荐
下面将详细解释如何实现Android中的ListView嵌套。 1. **基础概念** - **ListView**: Android提供的可滚动视图,用于显示一系列相同的数据项。 - **Adapter**: ListView的数据源,负责将数据转化为ListView可显示...
总结来说,实现Android的ListView嵌套ListView需要理解ListView的工作机制,创建并管理两个Adapter,以及在布局文件中正确地嵌套ListView。这虽然不是特别高深的技术,但却是Android开发中常见的需求,熟练掌握能...
总结来说,Android中嵌套ListView是一种实现多级列表的手段,常用于构建如淘宝订单列表这样的复杂界面。通过自定义Adapter、使用ViewHolder模式和处理滚动事件,可以有效地实现并优化此类功能。随着技术的进步,现在...
总之,实现Android中的嵌套ListView折叠列表需要对ListView的工作原理有深入理解,并能灵活运用Adapter和视图复用机制。同时,合理优化和选择合适的组件也是提高性能的关键。在实际开发中,应根据项目需求和性能要求...
嵌套ListView意味着在一个ListView的每个项视图(item view)中包含另一个ListView。这种方式可以让用户在滚动主列表时,同时看到并交互子列表,以展现层次化的数据。 要实现这样的功能,我们需要以下步骤: 1. **...
当需要实现复杂的列表结构,如QQ空间中的评论功能,其中评论可能存在二级、三级等多级嵌套时,我们通常会遇到ListView嵌套ListView的情况。这个场景在描述中被提到,目标是创建一个类似QQ空间评论的功能,允许用户...
在Android开发中,有时我们需要在一个ListView中嵌套另一个ListView,以实现更为复杂的数据展示效果,这就是所谓的“嵌套ListView”。这种布局方式常用于展现层级关系数据,如目录结构、论坛帖子回复等。本文将深入...
接下来,我们讨论ListView嵌套ListView的时间轴效果。时间轴通常用于展示按时间顺序排列的事件,如社交媒体的动态更新。在这种情况下,主ListView用于展示各个时间点,而每个时间点下又可能有多个子事件,这些子事件...
### Android-ListView中嵌套(ListView)控件兼容问题 #### 背景与问题描述 在Android开发中,有时我们需要在`ListView`中嵌套另一个`ListView`以实现更复杂的用户界面设计。然而,在实际操作过程中可能会遇到一些...
总的来说,Android开发中的ScrollView嵌套ListView和GridView是一项挑战,但通过巧妙地使用SwipeRefreshLayout、自定义适配器和滚动事件处理,我们可以构建出高效且功能丰富的用户界面。同时,不断优化性能和用户...
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
本文将详细介绍如何在Android中实现ListView嵌套GridView的解决方案。 首先,理解基本概念。ListView是一个可滚动的视图,用于显示一系列基于单行的数据项,通常用于长列表的显示。GridView则是布局管理器,它将子...
下面我们将详细介绍如何在Android中实现ListView嵌套GridView的功能。 首先,我们需要了解ListView的工作原理。ListView通过Adapter来获取数据并将其渲染为可视化的列表项。Adapter是一个接口,通常我们需要继承...
标题"listView嵌套listViewDemo"指的是一个示例项目,旨在解决此类问题。描述中提到,这个Demo解决了子ListView无法完全显示所有内容的困境,这是通过自定义ListView实现的。 ListView嵌套ListView的问题通常出现在...
本项目"ListView嵌套ListView带多选,全选,反选,选中数量"着重解决了在嵌套ListView中实现多选、全选、反选以及动态显示选中数量的功能。下面将详细介绍这些关键知识点。 1. **嵌套ListView**: 在Android中,...
直接两个listView 布局文件,数据直接输入,获得 嵌套ListView 的适配效果
【Android】ListView、RecyclerView、ScrollView里嵌套ListView 相对优雅的解决方案:NestFullListView 博客:http://blog.csdn.net/zxt0601/article/details/52494665
总之,ListView嵌套GridView是Android开发中的常见需求,通过合理设计Adapter和优化滚动性能,可以实现完全显示GridView内容且滚动不卡顿的效果。在实际项目中,根据具体需求进行调整和优化,可以提高用户体验。
标题“ListView嵌套ListView全选,多选”涉及到的关键知识点主要包括以下几个方面: 1. **嵌套ListView**:在一个ListView的每个Item内部再放置一个ListView,这样可以形成树状结构,便于展示层次化的数据。这种...
标题“androidListview嵌套Gridview”指出我们要讨论的是如何在Android的ListView中嵌入GridView。这个技术通常用于创建类似目录结构、商品分类或者媒体库等应用,其中每个大类(ListView的每一项)下都有多个小分类...