【发布时间】:2014-03-19 17:08:02
【问题描述】:
这是我的getView() 方法:
public View getView(final int pos, View convertView, ViewGroup parent) {
final ViewHolder holder;
int rowType = getItemViewType(pos);
if (convertView == null) {
switch (rowType) {
case 1:
convertView = mInflater.inflate(
R.layout.single_class_select_row_header, parent, false);
holder = new ViewHolder();
holder.label = (TextView) convertView
.findViewById(R.id.tvSingleClassSelectHeader);
convertView.setTag(holder);
break;
case 2:
final int newPos = getRealPosition(pos);
convertView = mInflater.inflate(
R.layout.single_class_select_row, parent, false);
holder = new ViewHolder();
holder.checkBox = (CheckBox) convertView
.findViewById(R.id.chkSession);
holder.mainLayout = (LinearLayout) convertView
.findViewById(R.id.llSingleClassLayout);
holder.phase = (TextView) convertView.findViewById(R.id.phase);
holder.class_info = (TextView) convertView
.findViewById(R.id.class_info);
holder.phase.setText(getListObject(pos).phase);
holder.class_info.setText(getListObject(pos).info);
convertView.setTag(holder);
holder.checkBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// edit out
}
}
});
holder.mainLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// edit out
}
}
});
holder.phase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// edit out
}
}
});
break;
}
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
谁能明白为什么?我查看了其他示例,但由于列表中间的标题,我覆盖了getItemViewType(),因此没有示例符合我的情况,因为我做事不同。
看来我应该把setOnClickListner 放在if-block 的下面,但是我的holder 变量没有被初始化,而其他实例需要它是final。
【问题讨论】:
-
您需要在您测试
convertView的if块的外部 设置任何数据,否则您将仅在该视图为空时设置数据(并在视图被回收时继续仅获取该数据)。 -
@Luksprog 就是这样。我只需要进行更改以使其正常工作以使所有
holder变量都满意。我现在明白了这个概念。你想回收 UI 视图,而不是数据! (如果您愿意,可以标记为答案)
标签: android android-listview adapter