我在Android中定义了一个自定义listView,用于显示树状结构数据集。一切都很好但是当我滚动一个被扩展的元素时,它开始变得非常糟糕。
使用viewHolder或缓存没有任何区别。
这是BaseAdapter的相关代码:
public TreeViewAdapter(Context context, List<TreeElementI> fileList) {
this.context = context;
this.fileList = fileList;
iconCollapse = BitmapFactory.decodeResource(context.getResources(), R.drawable.collapse);
iconExpand = BitmapFactory.decodeResource(context.getResources(), R.drawable.expand);
}
static class ViewHolder {
ImageView icon;
TextView text;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(context, R.layout.tree_item, null);
holder.text = (TextView) convertView.findViewById(R.id.text_tree);
holder.icon = (ImageView) convertView.findViewById(R.id.image_tree);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final TreeElementI elem = (TreeElementI) getItem(position);
int level = elem.getLevel();
holder.text.setText(elem.getOutlineTitle());
if (elem.hasChild()) {
if (elem.isExpanded())
holder.icon.setImageBitmap(iconCollapse);
else
holder.icon.setImageBitmap(iconExpand);
} else {
holder.icon.setVisibility(View.INVISIBLE);
}
return convertView;
}
在一些测试中,我注意到当我改变
时if (elem.isExpanded())
holder.icon.setImageBitmap(iconCollapse);
else
holder.icon.setImageBitmap(iconExpand);
到
if (elem.isExpanded())
holder.icon.setImageBitmap(iconExpand);
else
holder.icon.setImageBitmap(iconExpand);
或
if (elem.isExpanded())
holder.icon.setImageBitmap(iconCollapse);
else
holder.icon.setImageBitmap(iconCollapse);
listView不再是口吃,一切都很完美。方法isExpanded()也不是问题,因为它基本上是对象的getter函数,并且没有进行复杂的计算。
我也尝试过预加载图片,只改变两个选项的可见性,但没有结果:
static class ViewHolder {
ImageView collapse, expand;
TextView text;
}
if (elem.isExpanded()) {
holder.collapse.setVisibility(View.VISIBLE);
holder.expand.setVisibility(View.GONE);
} else {
holder.collapse.setVisibility(View.VISIBLE);
holder.expand.setVisibility(View.GONE);
}
答案 0 :(得分:0)
您是否尝试过将位图更改为BitmapDrawable,将图像设置为imageview,就像这样
BitmapDrawable obj = new BitmapDrawable(getResources(), bitmap)
在设置之前保留bitmapDrawable的2个实例。
使用imgvw.setBackgroundDrawable()通过bitmapdrawable设置imgview。