我有一个巨大的列表视图,有超过100,000个项目。我现在做了什么..
PostPaid accountItem = (PostPaid)arr.get(position);
ViewHolder holder;
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.list_support_item20, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.accountType);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(accountItem.getTitle());
我最初做了什么
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.list_support_item, null);
TextView accountType = (TextView) convertView.findViewById(R.id.accountType);
accountType.setText(accountItem.getTitle());
我想问一下两者之间的区别,哪个更好?我怎样才能进一步提高性能。我正在测试kitat nexus,并且在两种情况下都能很好地工作,但我正在试图找出姜饼问题
答案 0 :(得分:2)
I want to ask about the differences between two, and which on preferable?
要使用大量数据来表示总是优先使用ViewHolder
模式。正如您已经意识到的那样,如果您不使用此模式,则必须为属于您夸大的布局的每个视图调用findViewById
。使用此模式,您只需查找一次。
答案 1 :(得分:1)
Android列表视图的性能提示
了解listview回收的工作原理
How ListView's recycling mechanism works
引用文档
在滚动ListView期间,您的代码可能经常调用 findViewById(),这会降低性能。即使适配器返回一个膨胀的视图以进行回收,您仍然需要查找元素并更新它们。重复使用 findViewById()的方法是使用"视图持有者"设计模式。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) { // if convertView is null
convertView = mInflater.inflate(R.layout.mylayout,
parent, false);
holder = new ViewHolder();
// initialize views
convertView.setTag(holder); // set tag on view
} else {
holder = (ViewHolder) convertView.getTag();
// if not null get tag
// no need to initialize
}
//update views here
return convertView;
}
因此,每次使用ViewHolder都可以避免初始化视图,从而提高性能。仅当view为null时才初始化(if(convertView == null){。帮助平滑滚动。
你错过了重要的部分convertView.setTag(holder)和holder =(ViewHolder) ConvertView.getTag()