Android ListView 长度自适应item的内容 计算listview的高度

Android 原生的ListView的长度是不会根据里面内容项的多少而改变你之前定义的长度的(wrap_content或者是fill_parent)

但是有些时候就想, 我里面有一个Item, 它就显示一个item.   但是如果里面有2个Item, List的长度就增加一倍, 显示两个, OK这篇博文就是要说明一下如何实现, 之所以写, 是为了记录一下, 难免自己以后就忘记了.

OK, 首先,自己定义一个LIstView, 继承字ListView

package com.abc.pet.common.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
/**
 * 计算listview的高度加载到scrollview中
 * 
 */
public class MyDetailsListView extends ListView
{
 public MyDetailsListView(Context context)
 {
  super(context);
 }
 public MyDetailsListView(Context context, AttributeSet attrs)
 {
  super(context, attrs);
 }
 public MyDetailsListView(Context context, AttributeSet attrs, int defStyle)
 {
  super(context, attrs, defStyle);
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
 {
  // TODO Auto-generated method stub
  int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    MeasureSpec.AT_MOST);
  super.onMeasure(widthMeasureSpec, expandSpec);
 }
}

OK, 这样就可以在XML中用这个自定义的LIstView了, 来替换掉系统的LIstView

 <LinearLayout 
                android:orientation="vertical" 
                android:id="@+id/layout_added_pet_profile" 
                android:background="@drawable/layout_white_background" 
                android:layout_width="fill_parent" 
                android:layout_height="match_parent" 
                android:layout_marginTop="5.0dip">
               
                <com.abc.pet.common.view.MyDetailsListView
                 android:id="@+id/added_pet_list"
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
                 android:scrollbars="none"
                 android:layout_marginLeft="5dip"
                 android:layout_marginRight="5dip"
                 />
            </LinearLayout>

OK, 虽然我们的ListView是wrap_content, 但是它已经可以根据里面内容的多少, 自己计算ListView的高度了,来适应scrollview.

如何添加项目到ListView中呢, 就要用到adapter了, 接下来定义一个adapter.

public class AddedPetProfileItemAdapter extends BaseAdapter
{
 private Context mContext;
 private List<String> list;
 public AddedPetProfileItemAdapter()
 {
 }
 public AddedPetProfileItemAdapter(Context context, List<String> list)
 {
  this.mContext = context;
  this.list = list;
 }
 @Override
 public int getCount()
 {
  // TODO Auto-generated method stub
  return list.size();
 }
 @Override
 public Object getItem(int position)
 {
  // TODO Auto-generated method stub
  return position;
 }
 @Override
 public long getItemId(int position)
 {
  // TODO Auto-generated method stub
  return position;
 }
 @SuppressLint("NewApi")
 @Override
 public View getView(int position, View view, ViewGroup parent)
 {
  // TODO Auto-generated method stub
  final Holder hold;
  if (view == null)
  {
   hold = new Holder();
   view = View.inflate(mContext, R.layout.list_added_pet_profile_item,
     null);
   hold.added_pet_avatar = (ImageView) view
     .findViewById(R.id.added_pet_avatar);
     .
    .//等等一下东西
   .
   view.setTag(hold);
  }
  else
  {
   hold = (Holder) view.getTag();
  }
  //这里去设置hold里面的项目
  return view;
 }
 static class Holder
 {
  ImageView added_pet_avatar;// 添加了的宠物的照片
  EmojiconTextView added_pet_name;// 添加了的宠物的名字
  LinearLayout layoutadded_pet_gender_species;// 添加了的宠物的性别的背景
  ImageView added_pet_gender;// 性别图片
  TextView added_pet_species;// 种类名字
  TextView added_pet_age;// 年龄
  RelativeLayout layout_added_pet_profile;
 }
}

然后activity中去调用这个adapter 就可以了

AddedPetProfileItemAdapter addedPetAdapter = new AddedPetProfileItemAdapter(mContext, petPiclist);
MyDetailsListView added_pet_listView = (MyDetailsListView)findViewById(R.id.added_pet_list);
  added_pet_listView.setAdapter(addedPetAdapter);

OK, 这里就完了,

文章写的很急, 很烂, 希望看的童鞋们谅解, 主要也是用来记录的, 以后看到直接就拿来用了,  见谅.....

转载于:https://my.oschina.net/u/1377657/blog/349847

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值