【发布时间】:2014-07-27 22:59:53
【问题描述】:
我正在尝试使用 ExpendableListView 实现布局。有 4 个组元素,每个组有 2 个孩子。第一个组元素确实有 0 个子元素。
G
G
C
C
G
C
C
G
C
C
每个组元素都有 2 个 TextView、1 个 ImageView 和 1 个 Switch。 每个子元素都有 2 个 TextView 和 1 个 SeekBar。
适配器包含 2 个支架。一个用于 Groupviews,一个用于 Childviews。
在组层上,一切都按预期工作。
但是在子层上,不同的 ChildView 是相互依赖的。例如设置 Group Element3/Child Element1 的 SeekBar 也会设置 Group Element1/Child Element0 的 SeekBar。
我确实理解这个问题与缺少视图的唯一性和 Android 的视图处理(优化)有关。
这里是getChildView方法:
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final int tempgroupPos = groupPosition;
final int tempchildPos = childPosition;
ChildViewHolder cviewHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.interfaces_listrow_details_intervall, null);
cviewHolder = new ChildViewHolder();
cviewHolder.tvb = (TextView) convertView.findViewById(R.id.interfaces_child_intervall_textbig);
cviewHolder.tvs = (TextView) convertView.findViewById(R.id.interfaces_child_intervall_textexplanation);
cviewHolder.sb = (SeekBar) convertView.findViewById(R.id.interfacesSeekBar);
cviewHolder.sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
int getPosition = (Integer) seekBar.getTag();
clist.get(tempgroupPos).get(tempchildPos).setProgress(seekBar.getProgress());
// do stuff
notifyDataSetChanged();
}
});
convertView.setTag(cviewHolder);
convertView.setTag(R.id.interfaces_child_intervall_textbig, cviewHolder.tvb);
convertView.setTag(R.id.interfaces_child_intervall_textexplanation, cviewHolder.tvs);
convertView.setTag(R.id.interfacesSeekBar, cviewHolder.sb);
} else {
cviewHolder = (ChildViewHolder) convertView.getTag();
}
cviewHolder.sb.setTag(groupPosition);
cviewHolder.sb.setProgress(clist.get(groupPosition).get(childPosition).getProgress());
cviewHolder.tvb.setText(clist.get(groupPosition).get(childPosition).getBigText());
cviewHolder.tvs.setText(clist.get(groupPosition).get(childPosition).getSmallTextActivated());
return convertView;
}
如果您需要代码的任何其他部分或其他信息,请询问。
我查看了这些问题/答案,但它们并没有真正帮助我个人。
【问题讨论】:
-
ChildViewHolder中的视图是否声明为静态?此外,在SeekBar设置进度之后,将侦听器设置在if子句之外。 -
你能告诉我什么是clist吗?特别是这一行 clist.get(tempgroupPos).get(tempchildPos).setProgress(seekBar.getProgress());
-
哇,我不习惯这么快的答案。对不起。 @Luksprog ChildViewHolder 中的视图被声明为具有受保护变量的静态类。我现在已经在 if 子句之外设置了监听器。 /// clist 是“私有最终 List
- > clist;”。它应该保存视图元素的文本和进度值。这里它包含 3 个 List
对象和 2 个 Model 对象本身。 1 个模型包含 1 个 ListView 元素的字符串和值。
标签: android expandablelistview childviews