ListView Item使用多种布局优化

之前一直都不知道ListView有多种布局的优化方法,只能通过隐藏来实现,自己也知道效率肯定是很低的,但是也不知道有什么方法,这些天又查了一些资料,然后知道 其实google早就帮我们想好了优化方案了。

需要重写getItemViewType和getViewTypeCount方法。


	@Override
	public int getItemViewType(int position) {
		// TODO Auto-generated method stub
		return super.getItemViewType(position);
	}
	
	@Override
	public int getViewTypeCount() {
		// TODO Auto-generated method stub
		return super.getViewTypeCount();
	}


假设你的ListView Item有三种布局样式的可能:就比如很简单的显示一行字,要靠左,居中,靠右。

这时我们就可以在BaseAdapter里面重写两个方法:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private static final int TYPE_LEFT = 0;  
  2. private static final int TYPE_CENTER = 1;  
  3. private static final int TYPE_RIGHT = 2;  
  4.   
  5. @Override  
  6. public int getViewTypeCount() {  
  7.     return 3;  
  8. }  
  9.   
  10. //假如我们的数据列表是list,里面的Bean有一个属性(type)是表明这个item应该使用哪种布局的。  
  11. @Override  
  12. public int getItemViewType(int position) {  
  13.     return list.get(position).type;  
  14. }  
  15.   
  16. //然后在我们的getView方法就可以这样了  
  17.   
  18. @Override  
  19. public View getView(int position, View convertView, ViewGroup parent) {  
  20.     int type = getItemViewType(position);  
  21.     ViewHoldLeft holdLeft;  
  22.     ViewHoldCenter holdCenter;  
  23.     ViewHoldRight holdRight;  
  24.       
  25.     if (convertView == null) {  
  26.         switch(type) {  
  27.             case TYPE_LEFT:  
  28.                 holdLeft = new ViewHoldLeft();  
  29.                 convertView = xxxxxx//像普通的一样  
  30.                 holdLeft.textView = xxxxxx//像普通的一样  
  31.                 holdLeft.textView.setText("holdLeft");  
  32.                 convertView.setTag(holdLeft);  
  33.                 break;  
  34.             case TYPE_CENTER:  
  35.                 holdCenter = new ViewHoldCenter();  
  36.                 convertView = xxxxxx//像普通的一样  
  37.                 holdCenter.textView = xxxxxx//像普通的一样  
  38.                 holdCenter.textView.setText("holdCenter");  
  39.                 convertView.setTag(holdCenter);  
  40.                 break;  
  41.             case TYPE_RIGHT:  
  42.                 holdRight = new ViewHoldRight();  
  43.                 convertView = xxxxxx//像普通的一样  
  44.                 holdRight.textView = xxxxxx//像普通的一样  
  45.                 holdRight.textView.setText("holdRight");  
  46.                 convertView.setTag(holdRight);  
  47.                 break;  
  48.             default:  
  49.                 break;  
  50.         }  
  51.     } else {  
  52.         switch(type) {  
  53.             case TYPE_LEFT:  
  54.                 holdLeft = (ViewHoldLeft)convertView.getTag();  
  55.                 holdLeft.textView.setText("holdLeft");  
  56.                 break;  
  57.             case TYPE_CENTER:  
  58.                 holdCenter = (ViewHoldCenter)convertView.getTag();  
  59.                 holdCenter.textView.setText("holdCenter");  
  60.                 break;  
  61.             case TYPE_RIGHT:  
  62.                 holdRight = (ViewHoldRight)convertView.getTag();  
  63.                 holdRight.textView.setText("holdRight");  
  64.                 break;  
  65.             default:  
  66.                 break;  
  67.         }  
  68.     }  
  69.     return convertView;  
  70.       
  71. }  
  72.   
  73.   
  74. private static class ViewHoldLeft {  
  75.     private TextView textView;  
  76. }  
  77.   
  78. private static class ViewHoldCenter {  
  79.     private TextView textView;  
  80. }  
  81.   
  82. private static class ViewHoldRight {  
  83.     private TextView textView;  
  84. }  


附:

类似支付宝合并gridview表格

通过获取屏幕宽度,并重新设置item的宽度,注意隐藏相邻的item

					convertView
							.setLayoutParams(new GridView.LayoutParams(
									(width - 4) / 2,
									GridView.LayoutParams.MATCH_PARENT));

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值