同一个listview上下展示不同布局,解决两个listview上下显示不全问题

来源:互联网 发布:java怎么做ftp文件同步 编辑:程序博客网 时间:2024/05/15 10:25

最近不知不觉养成了写博客的习惯,有一些好的东西就要跟大家分享,如果碰到了相同的需求,可以节省开发的时间,不过我还是建议别人的东西只是参考的价值,只有自己去理解,如何变成自己的东西才算是进步。

好了废话不多说,我们项目这次实现的东西是两个完全不同的列表(两个列表的数据对象不一样,样式排版不一样)放在一个界面,分为上下的排列方式。遇到这样的情况首先会想到用两个listview上线排列显示。但是你会发现当第一个listview超过一屏幕的话,下面那个将无法显示。网上有一些解决的办法就是把两个listview放入ScrollView中。然后去动态计算listview的高度,或者自定义一个可以自己计算高度的listview。禁止listview的上下滑动,把它的滑动事件交给ScrollView去执行。这也是一个很好的办法。不过我想既然两个有上下之分,也就是有规律可循,所以通过修改Adpter来实现这样的效果。我的demo样式如下图这里写图片描述

按照我的思路只是放入一个lsitview。在自定义adpter的时候出入两个list集合。分为上下两个list.关键是在如何去显示问题。直接上代码:
/**
* @author frankLi
*
*/
public class MyAdapter extends BaseAdapter {

private List<DateBen1> listTop = null;private List<DateOther> listBottom = null;private Context mContext;private final int TOP_ITEM = 0, BOTTOM_ITEM = 1, TYPE_COUNT = 2;/** * 头部列表数据的大小 * */private int TopCount = 0;public MyAdapter(Context mContext, List<DateBen1> list,        List<DateOther> datasOther) {    this.mContext = mContext;    this.listTop = list;    this.listBottom = datasOther;    TopCount = listTop.size();}/** * 设置Item显示的数据集合 *  * @param list */public void setTopList(List<DateBen1> list) {    this.listTop = list;    TopCount = listTop.size();}/** * 设置Item显示的数据集合 *  * @param list */public void setBottomList(List<DateOther> list) {    this.listBottom = list;}@Overridepublic int getCount() {    int count = 0;    if (listTop != null && listBottom != null) {        count = TopCount + listBottom.size();    }    if (listTop != null && listBottom == null) {        count = TopCount;    }    if (listBottom != null && listTop == null) {        count = listBottom.size();    }    return count;}@Overridepublic Object getItem(int position) {    if (position >= 0 && position < TopCount) {        return listTop.get(position);    }    if (position > TopCount) {        return listBottom.get(position - TopCount);    }    if (position <= 1) {        return null;    }    return null;}@Overridepublic long getItemId(int position) {    return position;}/** 该方法返回多少个不同的布局 */@Overridepublic int getViewTypeCount() {    // TODO Auto-generated method stub    return TYPE_COUNT;}/** * 获取当前需要显示布局的类型  * return TOP_ITEM则表示上面半部分列表 * return BOTTOM_ITEM则表示下半部分列表 * **/@Overridepublic int getItemViewType(int position) {    if (position < TopCount)        return TOP_ITEM;    else        return BOTTOM_ITEM;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {    ViewHolder viewHolder = null;    if (convertView == null) {        viewHolder = new ViewHolder();        if (getItemViewType(position) == TOP_ITEM) {            convertView = LayoutInflater.from(mContext).inflate(                    R.layout.list_item_tv1, null);            viewHolder.tvName = (TextView) convertView                    .findViewById(R.id.tv_text_name);            viewHolder.tvid = (TextView) convertView                    .findViewById(R.id.tv_text_clientid);        } else {            convertView = LayoutInflater.from(mContext).inflate(                    R.layout.list_item_tv22, null);            viewHolder.tvDes = (TextView) convertView                    .findViewById(R.id.tv_text_des);        }        convertView.setTag(viewHolder);    } else {        viewHolder = (ViewHolder) convertView.getTag();    }    if (position < TopCount) {        viewHolder.tvName.setText(listTop.get(position).name);        viewHolder.tvid.setText(listTop.get(position).id);    } else {        viewHolder.tvDes.setText(listBottom.get(position - TopCount).des);    }    return convertView;}final static class ViewHolder {    TextView tvName;    TextView tvid;    TextView tvDes;}}

`

代码里面注释很详细。通过判断listTop的大小。来判断是那种显示样式。然后定义不同的convertView 。接下来就是放入你的数据。不过放入数据的过程一定要注意不要出现数组越界的问题。你得详细打印position.
下面附上我的demo链接
http://download.csdn.net/detail/u014007519/9456132

0 0