我有一个问题,搜索SO和谷歌后我找不到答案。在Android中使用适配器时,最好使用convertView
方法中的getView()
参数重用列表项视图。我的问题是,如果我对convertView
做出更改,这种更改是否会持续到将来调用getView()
?
例如:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
ViewHolder holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
convertView.setTag(holder);
// if i call this method here, will all future views passed into convertView
// also have this set??
// From what I know about Java and objects I would guess yes
// but I'm not 100% sure how Android processes the convertView behind the scenes
((ViewGroup) convertView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
// currently setDescendantFocusability is called here,
// I want to move it to where it above to help improve performance
return convertView;
}
答案 0 :(得分:2)
我是这么认为的。
您操作的已转换视图将在以后重复使用。
当您获得getView()
方法传递的转换视图时,之前可能已使用过特定的转换视图,因此请确保更新当前转换视图可能较脏的所有属性。
应该是以下代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null){
view = createSpecificView();
}
updateSpecificView(view);//update all attributes here.
return view;
}
希望可以帮到你。
答案 1 :(得分:2)
您需要在getView()结尾处返回convertView的唯一原因是它为null并且/或者您创建了一个新实例。将对象作为参数传递时,可以修改基础对象的状态,但不能更改或创建新对象。您无法更改convertView指向的对象。
因此,您还可以在方法结束时返回convertView。这包括您创建新对象的情况。