【问题标题】:How to delete a single View inside a ScrollView如何删除 ScrollView 中的单个视图
【发布时间】:2018-11-10 21:47:26
【问题描述】:

我的活动中有一个 ScrollView,在运行时向其中添加了 Views。基本上,当玩家定义他的姓名和性别(以及其他玩家的姓名和性别)然后单击加号按钮时,三个元素会添加到 ScrollView 内的一行中: one ImageView 表示性别(包含男性或女性图标),TextView 显示玩家姓名,删除按钮 在行尾,因此可以删除此播放器,例如,如果用户输入错误的播放器名称。

如果n是添加的玩家数量(或者加号按钮被点击的数量),那么ScrollView里面的Views数量就是n*3

点击添加玩家的加号按钮后,我还创建了一个PlayerDraft实例,其中包含了玩家的名字,玩家的性别和三个整数,对应的视图与player(1个int对应图标的id,1个int对应文本视图的id,代表玩家的名字,1个int对应播放器关联的删除按钮的id)。

我还在删除按钮的ids 和哈希图中的这个 PlayerDraft 实例之间进行跟踪。这样,当单击某个删除按钮时,我可以使用它的 id 来查找相应的 PlayerDraft 实例,因此也可以使用 Viewids ScrollView 中与此播放器相关联。

这是每次单击某个删除按钮时调用的代码(这基本上是在一个方法中,我在添加的每个删除按钮上调用该方法以将其设置为单击侦听器实例...此代码在setOnClickListener 方法):

public void onClick(View v)
    //delete corresponding player gender icon, player name and the delete button itself
    PlayerDraft playerToDelete = idToPlayer.get(v.getId());
    if(null != playerToDelete) {
            ImageView iconToDelete = findViewById(playerToDelete.getIconViewId());
            TextView textToDelete = findViewById(playerToDelete.getNameViewId());
            Button b = (Button) v;

            Log.d("thc", "Icon id that is to be deleted: " + iconToDelete.getId());
            Log.d("thc", "name view id that is to be deleted: " + textToDelete.getId());
            Log.d("thc", "delete button id to be deleted: " + b.getId());

            player_display_view.removeView(iconToDelete);
            player_display_view.removeViewInLayout(textToDelete);
            player_display_view.removeViewInLayout(b);

            //player_display_view.removeViewAt(0);
            //player_display_view.removeAllViews()

            Log.d("thc", "Number of elements in player_display_view scrollview: " + player_display_view.getChildCount());
    } else {
       Log.d("thc", "playerToDelete is null!");
    }
}

问题是调用player_display_view.removeView(iconToDelete) 或任何类似的方法都不起作用! 但是,调用player_display_view.removeAllViews() 有效。

我发现了以下问题。 player_display_view ScrollView 始终只包含一个孩子,并且该孩子位于其孩子数组中的位置 0。无论在运行期间向 ScrollView 添加了多少视图,子节点的数量都不会改变,这让我很困惑:/。 Views 怎么能显示在 ScrollView 中(他们是,在我的手机上测试它),如果它们没有被指定为那个 ScrollView 的孩子?调用方法player_display_view.removeViewAt(0); 来删除ScrollView 中的这个唯一的子视图,不仅会删除ScrollView 中的一个View,还会删除所有添加的视图。

为什么会出现以下情况?为什么 ScrollView 只包含一个子视图,尽管在运行时添加了多个视图?如何删除 ScrollView 中的特定视图?

感谢您抽出宝贵的时间,我真的很感激

【问题讨论】:

    标签: android android-view android-scrollview android-viewgroup


    【解决方案1】:

    一般来说,ScrollView 只包含一个孩子。这通常是由ScrollView 滚动的容器(如LinearLayoutRelativeLayout)。如果您动态(以编程方式)将Views 添加到ScrollView,它可能已经创建了一个内部容器Layout 来保存您添加的视图。

    您应该在您的ScrollView 中添加一个Layout,并在该Layout 中管理(添加/删除)您的Views。那么你的“删除”代码应该可以工作了。

    【讨论】:

    • 谢谢,您的解决方案已经奏效!我引入了另一个变量,它是 LinearLayout 类型,并将其命名为 player_display_layout,并通过访问 ScrollView 的唯一子项(这是默认创建的线性布局)来获取它。然后,在此线性布局 (player_display_layout) 上调用 removeView 会产生所需的结果。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2021-07-14
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多