0

想知道是否有人可以帮助我,或者只是知道这是否可以做到。我有一个 ListView 的自定义适配器,其中我有一些文本视图,它们始终存在并与 xml 布局中的文本视图相对应,这些文本视图被适配器为每一行膨胀。除了这些文本视图,我还需要以编程方式为 ListView 中的每一行添加一些文本视图。每行可能有不同数量的文本视图,需要以编程方式添加。当我这样做时,每次我向上和向下滚动列表视图时,以编程方式添加的文本视图都会被复制并添加到行中的其他文本视图中,所以如果我向上和向下滑动几次,我只会有一堆重复的文本框每一行。在 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);

        }

感谢您检查这一点。

4

1 回答 1

0

由于滚动出屏幕的容器会被缓存并重用,因此每次调用 getView() 时都会向容器中添加一个 textview。

如果达到 childCount,您可以计算容器的子项,遍历您的列表并仅添加

如果还没有达到 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++
}

编辑:因为您不需要每次都设置文本大小,所以我移动了电话

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10.5f);

在 else 语句中

于 2013-07-06T01:59:38.877 回答