【问题标题】:Child view not drawing While scrolling?滚动时不绘制子视图?
【发布时间】:2013-07-26 08:59:23
【问题描述】:

我使用View.scrollTo(...) 和 postDelay 计时器实现了一个代码来执行自动水平滚动,以保持滚动继续。

开始滚动我正在使用:

private void startScrolling() {

        handler.postDelayed(new Runnable() {
            public void run() {

                counter = (int) (counter + 10);
                handler.postDelayed(this, 100);

                    viewCount++;

                    if(viewCount == MAX_CHILD) {
                        viewCount = 0;
                        resetViewPosition(0);
                    }

                    llParent.scrollTo(counter , 0);
            }
        }, 1000L);
    }

最后我删除了每一个第一个视图并再次添加它,所以它最终会出现并显示为新的子视图:

private void resetViewPosition(int viewIndex) {

        View view = llParent.getChildAt(viewIndex);

        Log.v(TAG, "resetViewPosition : "+view.getId()+", "+llParent.getChildCount());
        llParent.removeViewAt(viewIndex);
        llParent.addView(view);
    }

问题:在此过程中,最初对于某些视图它运行正常,但很快下一个子视图不可见。仍在添加/删除进程运行,我在 resetViewPosition(..) 中正确获取索引 ID。它只是子视图没有绘制。

请建议我如何在父视图滚动时添加和显示视图?

【问题讨论】:

  • 如我所见,在函数resetViewPosition(int viewIndex) 中,您将孩子置于viewIndex 位置,然后将其从索引位置移除,最后将第一个视图设置在“队列”的底部" 使用llParent.addView(view);,但是,您正在使用resetViewPosition(0); 调用该函数-因此您已经删除了视图并尝试再次执行该过程。您应该使用迭代器 i = 0%MAXCHILD 更改对函数的调用。
  • 因为我已经删除了索引 0 视图。所以在第二次迭代中,第二个视图将是我的 0 索引视图......这就是我的想法?再次添加视图后,我的子项总数为 10,n 仅删除放置在最后一个索引的项目。我使用日志确认了它。
  • 您实际上有多少子视图?我的意思是新的孩子是按顺序添加的下一个索引,所以你应该删除 0,1,2,3 等,然后重新使用你的方法,但我认为对 resetViewPosition() 的调用是不正确的。尝试使用迭代器、内部计数器调用它,该计数器计算 viewCount = 0; 已执行的次数。
  • 所以当删除o索引视图时,下一个视图自动成为第一个视图......不是吗?
  • 试试这个,它不能解决它,但会给我们有价值的信息:View view = llParent.getChildAt(0); attachViewToParent (view, MAX_CHILD+1, llParent); detachViewFromParent (0); all this inside resetViewPosition()

标签: android scroll android-linearlayout


【解决方案1】:

正如讨论的那样替换这个:

private void resetViewPosition(int viewIndex) {

        View view = llParent.getChildAt(viewIndex);

        Log.v(TAG, "resetViewPosition : "+view.getId()+", "+llParent.getChildCount());
        llParent.removeViewAt(viewIndex);
        llParent.addView(view);
    }

用这个:

private void resetViewPosition(int viewIndex) {

  View view = llParent.getChildAt(0);
  attachViewToParent (view, MAX_CHILD+1, llParent);
  detachViewFromParent (0);
}

这是某种异常,因为您的方法使用了getChildAt()removeViewAt() 方法,这显然会留下一些空的Views。我认为这可以记录为票证。

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多