您的位置:首页 > 移动开发 > Android开发

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

2014-11-28 00:00 423 查看
摘要: Android ListView 长度自适应item的内容
计算listview的高度加载到scrollview中

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

文章写的很急, 很烂, 希望看的童鞋们谅解, 主要也是用来记录的, 以后看到直接就拿来用了, 见谅.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息