Android中关于listview填充多个布局

首先在网上可以找到很多关于Scrollview嵌套listview的解决方法,确实是可以解决,但是这种方法貌似可能会对以后的开发带来许多麻烦,并且官方也并不推荐这种做法。Google官方的原文如下:

You should never use a ScrollView with a ListView, because ListView takes care of its own vertical scrolling. Most importantly, doing this defeats all of the important optimizations in ListView for dealing with large lists, since it effectively forces the ListView to display its entire list of items to fill up the infinite container supplied by ScrollView.

网址:http://developer.android.com/intl/zh-cn/reference/android/widget/ScrollView.html

我的解决思路是在Listview中填充多个布局。假设现在有两种类型的布局,第一个Item是一张图片,其他Item是另一种类型的Item。我们可以使用getItemViewType()对两种类型的Item做区分,在这里我们还要重写getViewTypeCount()


首先声明初始化变量:

//listview中填充的第一种类型
private static final int ITEM_ONE = 0;
//listview中填充的第二张类型
private static final int ITEM_LEFT = 1;
/*listview总共要填充的类型, 这个很重要,需要重写getViewTypeCount()这个方法,不然在后面使用
getView()的时候viewHolder会出现类型转换错误。
*/
private static final int ITEM_COUNT = 2;

跟着重写getItemViewType()和 getViewTypeCount()

public int getItemViewType(int position) {
    if (position == ITEM_ONE) {
        return ITEM_ONE;
    } else {
        return ITEM_LEFT;
    }
}
public int getViewTypeCount() {
    return ITEM_COUNT;
}

然后重写getView()方法:

public View getView(int position, View convertView, ViewGroup parent) {
    SickerListviewInfo sickerListviewInfo = (SickerListviewInfo) getItem(position);
    int viewType = this.getItemViewType(position);
    ViewHolder viewHolder = new ViewHolder();
    View view = convertView;
    switch (viewType) {
        case ITEM_ONE:
            if (view == null) {
                view = mLayourInflater.inflate(R.layout.first_item, parent, false);
                viewHolder.graph = (ImageView) view.findViewById(R.id.graph_IV);

                view.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) view.getTag();
            }
            viewHolder.graph.setBackgroundResource(R.mipmap.graph);
            return view;
        case ITEM_LEFT:
            if (view == null) {
                viewHolder = new ViewHolder();
                view = mLayourInflater.inflate(resourceId, null);
                viewHolder.head_icon = (ImageView) view.findViewById(R.id.head_icon);
                viewHolder.time_iv = (ImageView) view.findViewById(R.id.time_iv);
                viewHolder.date_iv = (ImageView) view.findViewById(R.id.date_iv);
                viewHolder.editsicker = (ImageButton) view.findViewById(R.id.edit_sicker);
                viewHolder.name = (TextView) view.findViewById(R.id.name);
                viewHolder.time_tv = (TextView) view.findViewById(R.id.time_tv);
                viewHolder.date_tv = (TextView) view.findViewById(R.id.date_tv);
                view.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) view.getTag();
            }
            viewHolder.head_icon.setBackgroundResource(sickerListviewInfo.getHead_icon());
            viewHolder.time_iv.setBackgroundResource(sickerListviewInfo.getTime_iv());
            viewHolder.date_iv.setBackgroundResource(sickerListviewInfo.getDate_iv());
            viewHolder.editsicker.setBackgroundResource(sickerListviewInfo.getEdit_sicker());
            viewHolder.name.setText(sickerListviewInfo.getName());
            viewHolder.time_tv.setText(sickerListviewInfo.getTime_tv());
            viewHolder.date_tv.setText(sickerListviewInfo.getDate_tv());
            return view;
        default:
            break;
    }
    return null;
}

class ViewHolder {
    public ImageView head_icon;
    public ImageView time_iv;
    public ImageView date_iv;
    public ImageButton editsicker;
    public TextView name;
    public TextView time_tv;
    public TextView date_tv;
    public ImageView graph;
}

效果图


只是简单介绍了实现思路,具体的话可以自己实现。。有一个思路然后尝试自己造轮子对自己才会进步。

水平有限,写的不好的地方可以指出来。互相学习。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值