以编程方式在getView上的自定义适配器中添加文本视图

时间:2013-07-06 01:35:54

标签: android listview adapter

想知道是否有人可以帮助我或者只是知道是否可以这样做。我有一个用于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);

        }

感谢您查看此信息。

1 个答案:

答案 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);
在else语句中