0

mTxtText当我有maxLinesCount或更多行时,我需要显示一些视图。我检查了这些问题:第一个第二个

我的getView方法得到的结果是:

mTxtText.setText(Html.fromHtml(output));
mTxtText.getViewTreeObserver().addOnGlobalLayoutListener(
        new OnGlobalLayoutListener() {

            @SuppressWarnings("deprecation")
            @Override
            public void onGlobalLayout() {

                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                    mTxtText.getViewTreeObserver()
                            .removeGlobalOnLayoutListener(this);
                } else {
                    mTxtText.getViewTreeObserver()
                            .removeOnGlobalLayoutListener(this);
                }

                if (isCollapseOn
                        && mTxtText.getLineCount() >= maxLinesCount) {
                    mTxtExpand.setVisibility(View.VISIBLE);
                } else {
                    mTxtExpand.setVisibility(View.GONE);
                }
            }
        });

但是我得到了非常有趣的结果:这个监听器只被我适配器中的一些项目调用,而其他项目的可见性mTxtExpand是随机设置的。当我滚动列表时,甚至调用侦听器的项目也会显示错误的视图。

谢谢你的帮助。

4

1 回答 1

0

我建议您进行以下更改:

  1. 我从未使用过视图树观察器,但在我看来,整个列表的单个视图树观察器就足够了。我认为每个文本视图都不需要单独的观察者。

  2. 由于您希望不断收到布局通知,因此不要在收到通知后删除您的单视图树观察器。销毁整个列表时将其删除。

  3. 在每个布局通知中,检查所有列表单元格并检查每个单元格中的行数。您可以通过获取列表的所有子项来检查它们(使用 getChildAt() - 不使用您的适配器!)。您无需担心并发问题,因为只有一个 UI 线程,因此 getView 不会在您的迭代过程中运行。

  4. 您的每个列表单元格都包含一个文本视图和一个 txt 扩展。给他们特定的 id,这样您就可以在给定单元格视图(他们的父级)的情况下轻松搜索他们。

  5. 在您的大迭代中(在布局通知上),检查每个文本视图后,您可以通过转到文本视图的父级并使用 id 搜索它来获取其相应的 txt 扩展。

  6. 在您的观察者处理程序中,不要依赖外部状态变量,除非获得整个列表的引用。

于 2013-08-06T14:24:06.193 回答