之前一直都不知道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里面重写两个方法:
- private static final int TYPE_LEFT = 0;
- private static final int TYPE_CENTER = 1;
- private static final int TYPE_RIGHT = 2;
- @Override
- public int getViewTypeCount() {
- return 3;
- }
- //假如我们的数据列表是list,里面的Bean有一个属性(type)是表明这个item应该使用哪种布局的。
- @Override
- public int getItemViewType(int position) {
- return list.get(position).type;
- }
- //然后在我们的getView方法就可以这样了
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- int type = getItemViewType(position);
- ViewHoldLeft holdLeft;
- ViewHoldCenter holdCenter;
- ViewHoldRight holdRight;
- if (convertView == null) {
- switch(type) {
- case TYPE_LEFT:
- holdLeft = new ViewHoldLeft();
- convertView = xxxxxx//像普通的一样
- holdLeft.textView = xxxxxx//像普通的一样
- holdLeft.textView.setText("holdLeft");
- convertView.setTag(holdLeft);
- break;
- case TYPE_CENTER:
- holdCenter = new ViewHoldCenter();
- convertView = xxxxxx//像普通的一样
- holdCenter.textView = xxxxxx//像普通的一样
- holdCenter.textView.setText("holdCenter");
- convertView.setTag(holdCenter);
- break;
- case TYPE_RIGHT:
- holdRight = new ViewHoldRight();
- convertView = xxxxxx//像普通的一样
- holdRight.textView = xxxxxx//像普通的一样
- holdRight.textView.setText("holdRight");
- convertView.setTag(holdRight);
- break;
- default:
- break;
- }
- } else {
- switch(type) {
- case TYPE_LEFT:
- holdLeft = (ViewHoldLeft)convertView.getTag();
- holdLeft.textView.setText("holdLeft");
- break;
- case TYPE_CENTER:
- holdCenter = (ViewHoldCenter)convertView.getTag();
- holdCenter.textView.setText("holdCenter");
- break;
- case TYPE_RIGHT:
- holdRight = (ViewHoldRight)convertView.getTag();
- holdRight.textView.setText("holdRight");
- break;
- default:
- break;
- }
- }
- return convertView;
- }
- private static class ViewHoldLeft {
- private TextView textView;
- }
- private static class ViewHoldCenter {
- private TextView textView;
- }
- private static class ViewHoldRight {
- private TextView textView;
- }
附:
类似支付宝合并gridview表格
通过获取屏幕宽度,并重新设置item的宽度,注意隐藏相邻的item
convertView
.setLayoutParams(new GridView.LayoutParams(
(width - 4) / 2,
GridView.LayoutParams.MATCH_PARENT));