简体   繁体   English

如何在Android listiview中使用不同的行布局

[英]How to use different row layouts in Android listiview

I have two layouts for listview.(one for separator, another one for list item) And I have two view holder classes for each layouts. 我有两个listview布局。(一个用于分隔符,另一个用于列表项)我有两个视图持有者类用于每个布局。 How to use these different layouts properly in listview? 如何在listview中正确使用这些不同的布局?

Below is my getView() method of custom adapter. 下面是我的自定义适配器的getView()方法。

@Override
public View getView(int position, View convertView, ViewGroup parent){
    int pos = position;
    final Context context = parent.getContext();
    int viewType = this.getItemViewType(position);
    View view = convertView;

    switch(viewType){

        case TYPE_ITEM:
            HolderItem holder_item;

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

                holder_item = new HolderItem();
                holder_item.title = (TextView) view.findViewById(R.id.title);
                holder_item.subTitle = (TextView) view.findViewById(R.id.sub_title);
                view.setTag(holder_item);
            }else{
                holder_item = (HolderItem) view.getTag();
            }

            holder_item.title.setText(titleList.get(pos));
            holder_item.subTitle.setText(infoList.get(pos));
            return view;

        case TYPE_SEPARATOR:
            HolderSeparator holder_sep;

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

                holder_sep = new HolderSeparator();
                holder_sep.separator = (TextView) view.findViewById(R.id.list_header);
                view.setTag(holder_sep);
            }else{
                holder_sep = (HolderSeparator)view.getTag();
            }

            holder_sep.separator.setText(titleList.get(pos));
            return view;


        default:
            return view;
    }

}

public int getItemViewType(int position){
    if(position == 0 || position == 5) return TYPE_SEPARATOR;
    else return TYPE_ITEM;
}

class HolderItem{
    TextView title;
    TextView subTitle;
}
class HolderSeparator{
    TextView separator;
}

There are two separators(in the top of listview and the middle of listview) Above code works fine first but when I starts to scroll it occurs ClassCastException 有两个分隔符(在listview的顶部和listview的中间)上面的代码工作正常,但是当我开始滚动它时发生ClassCastException

java.lang.ClassCastException: com.soonoo.listtest.Adapter$Holder cannot be cast to com.soonoo.listtest.Adapter$HolderItem

I think my code uses two view holders and when scrolls, new list item uses view holder of separator. 我认为我的代码使用两个视图持有者,当滚动时,新的列表项使用分隔符的视图持有者。 How can I fix it? 我该如何解决?

如果重写getItemViewType() ,则还需要覆盖getViewTypeCount() ,以指示您拥有的行数类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM