在列表视图中使用getItemType

时间:2014-01-19 07:42:57

标签: android listview

我想在列表视图中添加动态标头,即列表视图标题的动态数据,它将来自加载列表视图时的已解析信息。

请阅读下面的方案。必须了解我的问题。

我正在这样做,使用getItemType作为列表视图的位置0。

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView==null){

        int type = getItemViewType(position);
        if(type==TYPE_HEADER){
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.my_basket_small_item, parent,false);
            convertView.setTag(holder);
        }else{
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.my_basket_small_item, parent,false);

            holder.tv_price = (TextView)convertView.findViewById(R.id.tv_price);
            holder.tv_distance = (TextView)convertView.findViewById(R.id.tv_distance);
            holder.img_brandLogo = (ImageView)convertView.findViewById(R.id.img_brandlogo_top);
            holder.img_beerCanLogo = (ImageView)convertView.findViewById(R.id.img_beerCan);
            holder.click4map = (Button)convertView.findViewById(R.id.btn_click_for_map);
            holder.offers = (Button)convertView.findViewById(R.id.btn_my_basket_offers);
        }
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }
    return convertView;
}

我的问题是我想用动态数据加上列表视图行(arraylist大小的总数)来显示固定的标题。 现在它的工作量减少了一行,因为列表视图标题占用了一行。

场景:  例如4个列表视图行即将到来(没有标题) 当我使用标题时,又会有4行,我只想在使用标题时,1个标题加上4行应该来。

希望你明白。

由于

2 个答案:

答案 0 :(得分:1)

您应该通过调用添加标头:

<ListView>.addHeaderView(<HeaderView>,null, false);

仅使用适配器设置项目。

在您当前的实现中,您可以覆盖:

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return <list>.size()+1;
}

答案 1 :(得分:1)

此问题还有另一种方法 - 每个视图项都包含在getView方法中管理可见性的标头。 您的列表项布局文件可能如下所示:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/header"
            android:visibility="gone"
            android:orientation="horizontal"
            android:gravity="center_vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <TextView 
                android:id="headerTextView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ImageView
                android:id="@+id/itemImageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <TextView
                android:id="@+id/itemTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>

和getView()可能如下所示:

    if(converView == null) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.my_basket_small_item, parent, false);

        holder = new ViewHolder();
        holder.header = convertView.findViewById(R.id.header);
        holder.headerTextView = (TextView)convertView.findViewById(R.id.headerTextView);
        holder.tv_price = (TextView)convertView.findViewById(R.id.tv_price);
        holder.tv_distance = (TextView)convertView.findViewById(R.id.tv_distance);
        holder.img_brandLogo = (ImageView)convertView.findViewById(R.id.img_brandlogo_top);
        holder.img_beerCanLogo = (ImageView)convertView.findViewById(R.id.img_beerCan);
        holder.click4map = (Button)convertView.findViewById(R.id.btn_click_for_map);
        holder.offers = (Button)convertView.findViewById(R.id.btn_my_basket_offers);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    int type = getItemViewType(position);
    if(type==TYPE_HEADER){
        holder.header.setVisibility(View.SHOW);
        holder.headerTextView.setText("Header");
    }else{
        holder.header.setVisibility(View.GONE);
    }

    ...