带有CustomAdapter显示构件的Android ExpandableListView

带有CustomAdapter显示构件的Android ExpandableListView,android,custom-adapter,Android,Custom Adapter,我面临着ExpandableListView和自定义适配器的错误 它看起来像是TextView采用的不是自己的值,您可以在视频中看到。模型仅在此列表中不更改此值 姓名和电话不影响,但两个右文本视图是 有人见过这个虫子吗? 知道如何追踪和修复它吗 upd public ExpandableAdapter(列出类别模型、上下文ctx){ this.categoryModels=categoryModels; this.ctx=ctx; } @凌驾 public int getGroupCount(

我面临着
ExpandableListView
和自定义适配器的错误 它看起来像是
TextView
采用的不是自己的值,您可以在视频中看到。模型仅在此列表中不更改此值

姓名和电话不影响,但两个右文本视图是

有人见过这个虫子吗? 知道如何追踪和修复它吗

upd

public ExpandableAdapter(列出类别模型、上下文ctx){
this.categoryModels=categoryModels;
this.ctx=ctx;
}
@凌驾
public int getGroupCount(){
返回categoryModels.size();
}
@凌驾
公共整数getChildrenCount(整数组位置){
返回categoryModels.get(groupPosition.getMembers().size();
}
@凌驾
公共对象getGroup(int-groupPosition){
返回categoryModels.get(groupPosition);
}
@凌驾
公共对象getChild(int-groupPosition,int-childPosition){
返回categoryModels.get(groupPosition).getMembers().get(childPosition);
}
@凌驾
公共长getGroupId(int-groupPosition){
返回categoryModels.get(groupPosition.getId();
}
@凌驾
公共长getChildId(int-groupPosition,int-childPosition){
返回categoryModels.get(groupPosition.getMembers().get(childPosition.getId());
}
@凌驾
公共布尔表ID(){
返回true;
}
@凌驾
公共视图getGroupView(int groupPosition、布尔isExpanded、视图convertView、视图组父级){
视图v=转换视图;
如果(v==null){
LayoutInflater充气器=(LayoutInflater)ctx.getSystemService
(上下文、布局、充气机和服务);
v=充气机。充气(R.layout.reg_group_布局,父级,false);
}
TextView组名=(TextView)v.findviewbyd(R.id.tv\u组名);
TextView组计数=(TextView)v.findViewById(R.id.tv\u组计数);
CategoryModel cat=categoryModels.get(groupPosition);
groupName.setText(cat.toString());
groupCount.setText(cat.getMembers().size()+);
返回v;
}
@凌驾
公共视图getChildView(int-groupPosition、int-childPosition、布尔isLastChild、视图convertView、视图组父级){
视图v=转换视图;
如果(v==null){
LayoutInflater充气器=(LayoutInflater)ctx.getSystemService
(上下文、布局、充气机和服务);
v=充气机充气(R.layout.reg_成员布局,父级,false);
}
TextView tvName=(TextView)v.findViewById(R.id.tv_reg_mem_name);
TextView tvPhone=(TextView)v.findViewById(R.id.tv\u reg\u mem\u phone);
TextView tvFinishTime=(TextView)v.findViewById(R.id.tv_reg_finishtime);
TextView tvPenaltyTime=(TextView)v.findViewById(R.id.tv_reg_penaltytime);
MemberModel mem=(MemberModel)getChild(groupPosition,childPosition);
如果(!mem.getActive()){
tvName.setTextColor(Color.GRAY);
tvPhone.setTextColor(Color.GRAY);
}否则{
tvName.setTextColor(Color.BLACK);
tvPhone.setTextColor(Color.BLACK);
}
tvName.setText(mem.getMem_name());
setText(mem.getMem_tel());
Util.setFinishTime(tvFinishTime,mem.getFinishTime());
Long penTime=mem.getPenaltyTime();
如果(奔腾!=null&&奔腾!=0){
Util.setPenaltyTime(tvPenaltyTime,penTime);
}否则{
//tvpnaltime.setVisibility(View.INVISIBLE);
}
返回v;
}
@凌驾
公共布尔值isChildSelectable(int-groupPosition,int-childPosition){
返回true;
}
@凌驾
公共布尔onChildClick(ExpandableListView父视图、视图v、int-groupPosition、int-childPosition、长id){
返回true;
}
@凌驾
公共无效注册表DataSetObserver(DataSetObserver observer){
超级注册数据集观察者(观察者);
}

确保始终设置FinishTime和PenaltTime,即使是空的空格也是如此

正在发生的事情是,您得到了ConvertView(旧视图和旧内容),您需要用新内容填充它们。这些线路:

  if (penTime != null && penTime != 0) {
        Util.setPenaltyTime(tvPenaltyTime, penTime);
    } else {
        //tvPenaltyTime.setVisibility(View.INVISIBLE);
    }
如果不是0,将设置惩罚时间,但如果是0,则保留旧视图的旧值,以其为准。这就是为什么当带有惩罚时间的行退出屏幕时,进入屏幕的新视图将保留旧的惩罚时间(如果没有)

学习
查看回收
的工作原理是值得的!您可以通过使用
ViewHolder
和缓存
findViewById
进一步优化适配器

所以你可以做:

    if (penTime != null && penTime != 0) {
        Util.setPenaltyTime(tvPenaltyTime, penTime);
    } else {
        Util.setPenaltyTime(tvPenaltyTime, 0);
    }
或者,就像你尝试的那样

    if (penTime != null && penTime != 0) {
        Util.setPenaltyTime(tvPenaltyTime, penTime);
        tvPenaltyTime.setVisibility(View.VISIBLE);
    } else {
        tvPenaltyTime.setVisibility(View.INVISIBLE);
    }

股票代码。。。。。。。。。。。。。。。。。。链接到视频
    if (penTime != null && penTime != 0) {
        Util.setPenaltyTime(tvPenaltyTime, penTime);
        tvPenaltyTime.setVisibility(View.VISIBLE);
    } else {
        tvPenaltyTime.setVisibility(View.INVISIBLE);
    }