ListView展示不同类型条目的实现方法

来源:互联网 发布:快手慢动作视频软件 编辑:程序博客网 时间:2024/05/12 06:00

实现方法主要有两种:

        1、所有Item使用同一个布局文件,这个布局文件中包含所有情况下需要的控件,通过在getView中判断显示类型设置不同控件的可见性。

                 这种方法的优点是只需要写一个布局文件,缺点是维护困难,而且getView内部的控件控制逻辑复杂,每个条目内部的控件都会有冗余,造成资源浪费。

        2、使用ListAdapter提供的实现方案,每种显示类型的Item分别提供布局文件,然后通过getItemTypeCount设置Item类型数量。

               这种方法的缺点是需要维护多个布局文件,但是getView处理更加方便,减少展示层内部的逻辑判断,能够有效利用所有的控件元素。ListView内部会为每一种类型的Item维护一个缓存复用队列,所以效率最高。


demo主要的代码如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    MyItem item = (MyItem) getItem(position);
    switch (getItemViewType(position)) { // 根据不同的条目类型产生不同的Item控件
        case MyItem.ITEM:
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.news_item, null);
                Holder holder = new Holder();
                holder.date = (TextView) convertView.findViewById(R.id.time);
                holder.title = (TextView) convertView.findViewById(R.id.content);
                holder.image = (ImageView) convertView.findViewById(R.id.imageView);
                convertView.setTag(holder);
            }
            Holder holder = (Holder) convertView.getTag();
            holder.date.setText(item.getDate());
            holder.image.setImageResource(item.getImageUrl());
            holder.title.setText(item.getText());
            break;
        case MyItem.MORE:
            if (convertView == null) {
                convertView = new TextView(context);
            }
            ((TextView) convertView).setText(item.getText());
            ((TextView) convertView).setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
            ((TextView) convertView).setHeight(150);
            break;
        case MyItem.TITLE:
            if (convertView == null) {
                convertView = new TextView(context);
                convertView.setBackgroundColor(Color.parseColor("#66666666"));
            }
            ((TextView) convertView).setText(item.getText());
            ((TextView) convertView).setPadding(50000);
            ((TextView) convertView).setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
            ((TextView) convertView).setHeight(150);
            break;
        default:
            throw new IllegalArgumentException("Error type");
    }
    return convertView;
}
@Override
public int getItemViewType(int position) { // 返回当前Item展示类型
    return items.get(position).getItemType();
}
@Override
public int getViewTypeCount() { // 总共需要展示的条目类型数量
    return 3;
}



0 2