想知道是否有人可以帮助我或者只是知道是否可以这样做。我有一个用于ListView的自定义适配器,其中我有一些文本视图,这些文本视图始终存在并与xml布局中的textview相对应,每个行都由适配器充气。除了这些textview之外,我还需要以编程方式为ListView中的每一行添加一些textview。每行可能具有需要以编程方式添加的不同数量的文本视图。当我这样做时,每次我在列表视图中上下滚动时,编程添加的文本视图都会被复制并添加到行中的其他文本视图中,所以如果我上下几次scoll,我只有一堆重复的文本框每一行。在getView方法中,我有以下代码来提取动态信息并添加文本框:
Set recordDeailList = item.getRecordDetailList().keySet();
Iterator<String> iterator = recordDeailList.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = item.getRecordDetailList().get(key);
TextView textView = new TextView(RecordsFragment.this.getActivity());
textView.setText(key + ": " + value);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);
);
container.addView(textView);
}
感谢您查看此信息。
答案 0 :(得分:0)
由于滚动出屏幕的容器会被缓存并重复使用,因此每次调用getView()时都会向容器中再添加一个textview。
您可以计算容器的子项,迭代列表并仅添加,如果达到了childCount
如果尚未达到子计数,则计算其余的(无用的文本视图)并调用setVisibility(View.GONE)
这样,您迟早会达到某一点,几乎所有容器都具有相同的子计数,并且不会添加新实例
一些示例代码,我现在没有测试:
Set recordDeailList = item.getRecordDetailList().keySet();
Iterator<String> iterator = recordDeailList.iterator();
int i = 0;
int childCount = container.getChildCount();
while (iterator.hasNext()) {
String key = iterator.next();
String value = item.getRecordDetailList().get(key);
TextView textView;
if (i < childCount) {
//reuse existing textview
textView = container.getChildAt(i);
}
else {
// create new TextView and add
textView = new TextView(RecordsFragment.this.getActivity());
container.addView(textView);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);
}
textView.setText(key + ": " + value);
i++;
}
while(i < childCount) {
//hide useless children
container.getChildAt(i).setVisibility(View.GONE);
i++
}
编辑:因为您不需要每次都设置文本大小,.i移动了调用
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);