2017-05-25 12 views
0

ExpandableListViewとカスタムアダプターのバグに直面しています TextViewは自分の値ではなく、ビデオで見ることができます。モデルはこのリスト内でのみこの値を変更しません。CustomAdapterディスプレイのアーティファクトを含むExpandableListView

名前と電話機は影響を受けませんが、2つの右テキストビューがあります。

https://www.youtube.com/embed/YjC_QsA75yo

誰かがこのバグを満たしていますか? それをトレースして修正する方法はありますか?

UPD

public ExpandableAdapter(List<CategoryModel> categoryModels, Context ctx) { 
    this.categoryModels = categoryModels; 
    this.ctx = ctx; 
} 

@Override 
public int getGroupCount() { 
    return categoryModels.size(); 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return categoryModels.get(groupPosition).getMembers().size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return categoryModels.get(groupPosition); 
} 

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    return categoryModels.get(groupPosition).getMembers().get(childPosition); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return categoryModels.get(groupPosition).getId(); 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return categoryModels.get(groupPosition).getMembers().get(childPosition).getId(); 
} 

@Override 
public boolean hasStableIds() { 
    return true; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 

    View v = convertView; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) ctx.getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.reg_group_layout, parent, false); 
    } 

    TextView groupName = (TextView) v.findViewById(R.id.tv_group_name); 
    TextView groupCount = (TextView) v.findViewById(R.id.tv_group_count); 

    CategoryModel cat = categoryModels.get(groupPosition); 
    groupName.setText(cat.toString()); 
    groupCount.setText(cat.getMembers().size() + ""); 

    return v; 
} 

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 

    View v = convertView; 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) ctx.getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.reg_member_layout, parent, false); 
    } 

    TextView tvName = (TextView) v.findViewById(R.id.tv_reg_mem_name); 
    TextView tvPhone = (TextView) v.findViewById(R.id.tv_reg_mem_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); 

    if (!mem.getActive()) { 
     tvName.setTextColor(Color.GRAY); 
     tvPhone.setTextColor(Color.GRAY); 
    } else { 
     tvName.setTextColor(Color.BLACK); 
     tvPhone.setTextColor(Color.BLACK); 
    } 

    tvName.setText(mem.getMem_name()); 
    tvPhone.setText(mem.getMem_tel()); 
    Util.setFinishTime(tvFinishTime, mem.getFinishTime()); 
    Long penTime = mem.getPenaltyTime(); 
    if (penTime != null && penTime != 0) { 
     Util.setPenaltyTime(tvPenaltyTime, penTime); 
    } else { 
     //tvPenaltyTime.setVisibility(View.INVISIBLE); 
    } 
    return v; 
} 


@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 

@Override 
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
    return true; 
} 

@Override 
public void registerDataSetObserver(DataSetObserver observer) { 
    super.registerDataSetObserver(observer); 
} 
+2

共有コードを試みたように見えるよう、

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

をか.................. –

+0

[link](https://www.youtube.com/watch?v=YjC_QsA75yo)ビデオへのリンク – user2756073

答えて

0

は、空の場合は、常に偶数のスペースに、FinishTimeとPenaltytimeを設定していることを確認します。

何が起こっているのですか?convertViews(古いコンテンツの古いビュー)が表示され、新しいコンテンツを埋め込む必要があります。これらの行:それは0ではない場合

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

はペナルティ時間を設定しますが、それが0であれば、あなたはそれがあった方古いビューの古い値を残しています。そのため、ペナルティ時間のある行が画面を終了すると、画面に入る新しいビューには古いペナルティ時間がありません。

どのようにしてView Recyclingが機能するかを知ることができます。アダプタをさらに最適化するには、ViewHolderとキャッシングfindViewById'sを使用します。

だからあなたが行うことができます:あなたは、

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

、rupps!素敵な仕事 – user2756073

+0

クール!それがあなたのために働いた場合、答えを受け入れてください! – rupps

関連する問題