只重新布置孩子而不是所有的树

Posted

技术标签:

【中文标题】只重新布置孩子而不是所有的树【英文标题】:Only relayout children and not all the tree 【发布时间】:2012-04-24 16:34:52 【问题描述】:

我正在尝试通过视图回收来重新创建 ListView(和 AbsListView)逻辑。 我需要这个,但我们可以说它只是为了理解 android 逻辑。

假设我的子项是相同的(相同的布局),使用固定高度RelativeLayout

在滚动期间,我正在重用幽灵子视图并为当前项目设置属性。 它工作正常,因为我使用 View.offsetTopAndBottom()invalidate() 而不是在滚动期间请求布局以进行优化。

我的问题是更新孩子 (RelativeLayout)。

取决于项目,我想在该项目上隐藏或显示ImageView。为此,我只使用iconImage.setVisibility( GONE )iconImage.setVisibility( VISIBLE )

由于我屏蔽了requestLayout,看来setVisibility()不能正常工作。

如果我使用requestLayout,所有的树都会自行测量和布局,这不是滚动用户体验的好方法。

有没有办法只在回收子项上请求布局?

【问题讨论】:

【参考方案1】:

您需要通知您的 listView 更改视图,因此请从 Uithread 调用 notifyDataSetChanged();,如下所示:

        final ArrayAdapter adapter = ((ArrayAdapter) getListAdapter());
    runOnUiThread(new Runnable() 
        @Override
        public void run() 
            adapter.notifyDataSetChanged();
        
    );

【讨论】:

以上是关于只重新布置孩子而不是所有的树的主要内容,如果未能解决你的问题,请参考以下文章

颤振错误:每个孩子必须恰好布置一次。关于建筑布局

反应只重新渲染一个孩子

用孩子兄弟链表表示的树,查找其某一个数据等于a的节点

主管的所有孩子都死后会发生啥?

第n个孩子的问题-它确实计算了所有div,而不是某些类别的div [重复]

Java中的树实现(根,父母和孩子)