ListView展示两种布局
来源:互联网 发布:linux grep wc -l 编辑:程序博客网 时间:2024/05/22 05:23
关于在ListView中显示两种布局时,某次曾经出现过ViewHolder的类转换异常。解决方法是在convertView不为null时,进行holder与type的判断,如果不匹配,则将convertView设置为null。
if ((convertView != null && convertView.getTag() instanceof ViewHolder1 && type == TYPE_2)||(convertView != null && convertView.getTag() instanceof ViewHolder2 && type == TYPE_1)) { convertView = null;}
可是这次写新的demo并没有出现这种情况。相关实现方法如下。
首先需要重写getViewTypeCount与getItemViewType这两个方法,type的值必须从0开始。
private static final int TYPE_1 = 0; private static final int TYPE_2 = 1; @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if (position % 5 < 2) { return TYPE_1; } else { return TYPE_2; } }
然后就在getView中进行当前位置的判断确定是哪种类型并进行相应的加载。并提供两个ViewHolder进行不同布局的视图控制。当convertView为null时判断一次,convertView与holder绑定时判断一次,以及convertView不为null被复用时判断一次。
getView的相关代码如下:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder1 holder1 = null; ViewHolder2 holder2 = null; int type = getItemViewType(position); if (convertView == null) { switch (type) { case TYPE_1: convertView = LayoutInflater.from(context).inflate(R.layout.list_item1,null); holder1 = new ViewHolder1(); holder1.tvName = (TextView) convertView.findViewById(R.id.tv_name); holder1.tvHabit = (TextView) convertView.findViewById(R.id.tv_habit); holder1.tvAge = (TextView) convertView.findViewById(R.id.tv_age); convertView.setTag(holder1); break; case TYPE_2: convertView = LayoutInflater.from(context).inflate(R.layout.list_item2,null); holder2 = new ViewHolder2(); holder2.tvName = (TextView) convertView.findViewById(R.id.tv_name); holder2.tvAge = (TextView) convertView.findViewById(R.id.tv_age); convertView.setTag(holder2); break; } }else{ switch (type){ case TYPE_1: holder1 = (ViewHolder1) convertView.getTag(); break; case TYPE_2: holder2 = (ViewHolder2) convertView.getTag(); break; } } People p = list.get(position); switch (type){ case TYPE_1: holder1.tvName.setText(p.name); holder1.tvAge.setText(p.age+""); holder1.tvHabit.setText(p.habit); break; case TYPE_2: holder2.tvName.setText(p.name); holder2.tvAge.setText(p.age+""); break; } return convertView; }
供加载的两种布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="@dimen/activity_horizontal_margin"> <TextView android:id="@+id/tv_name" android:text="name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_habit" android:text="habit" android:layout_below="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_age" android:layout_below="@id/tv_habit" android:text="0" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_alignParentRight="true" android:layout_alignBaseline="@id/tv_name" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/ic_launcher"/></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ccc" android:padding="@dimen/activity_horizontal_margin"> <TextView android:id="@+id/tv_name" android:text="name" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_age" android:layout_below="@id/tv_name" android:layout_alignParentRight="true" android:text="0" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:layout_alignBaseline="@id/tv_name" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/ic_launcher"/></RelativeLayout>
最后实现的结果:
当时出现异常的情况是:当拖动速度较快时会发生,如果慢慢的拖动则不会出现这种异常,如今不能重现这种情况了。不知道是不是当时进行网络请求的原因。希望有人能够告知一下。
0 0
- ListView展示两种布局
- ListView多布局展示
- 【listview】pinned-section-listview应用 + 两种布局的listview
- ListView多布局展示bug
- Android Listview中使用两种布局
- 实现Listview两种布局的加载
- 在Listview上展示图片的两种方法(一)
- Android中对ListView的展示的性能优化常见的两种方案
- 元素的三种展示类型和两种基础布局方式
- 多条目展示ListView(如:有两种不同的布局图片在listview条目上展示)
- ListView中使用ul-li布局展示数据
- ListView中使用table-tr-td布局展示数据
- ListView多布局展示 异常 数组下标越界
- pullToRefreshView 加载多布局展示 数组下标越界(ListView相同)
- 实现顶部轮播,下部listview经典布局的两种方式
- 实现顶部轮播,下部listview经典布局的两种方式
- 实现顶部轮播,下部listview经典布局的两种方式
- 实现顶部轮播,下部listview经典布局的两种方式
- 虚拟机上不能使用CUDA
- C_插入排序
- 有关于android:largeHeap 的一些观点
- android webview使用
- python time module
- ListView展示两种布局
- 如何使用C语言访问sql server(转载)
- Struts2标签之—theme
- C语言中volatile关键字的作用
- [codevs2573/洛谷P1801]黑匣子
- freeswitch 解决方案之视频会议
- Struts标签库
- 使用json_encode将中文转成unicode
- (七)函数