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, 这里就完了,

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

你可能感兴趣的:(ListView,scrollview,自定义ListView)