Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何删除滚动视图中的单个视图_Android_Android View_Android Scrollview_Android Viewgroup - Fatal编程技术网

Android 如何删除滚动视图中的单个视图

Android 如何删除滚动视图中的单个视图,android,android-view,android-scrollview,android-viewgroup,Android,Android View,Android Scrollview,Android Viewgroup,我的活动中有一个滚动视图,在运行时将视图添加到其中。基本上,当玩家定义自己的姓名和性别(以及其他玩家的姓名和性别)并单击加号按钮时,三个元素会添加到滚动视图内的一行:一个性别图像视图(包含男性或女性图标),一个文本视图以显示玩家的姓名,并在行尾显示一个删除按钮,因此可以删除该玩家,例如,如果用户错误输入了玩家的姓名 如果n是添加的播放器数量(或单击加号按钮的数量),则滚动视图中的视图数量为n*3 单击添加播放器的加号按钮后,我还创建了一个PlayerDraft实例,其中包含播放器的名称、播放器的

我的活动中有一个滚动视图,在运行时将
视图添加到其中。基本上,当玩家定义自己的姓名和性别(以及其他玩家的姓名和性别)并单击加号按钮时,三个元素会添加到滚动视图内的一行:一个性别图像视图(包含男性或女性图标),一个文本视图以显示玩家的姓名,并在行尾显示一个删除按钮,因此可以删除该玩家,例如,如果用户错误输入了玩家的姓名

如果
n
是添加的播放器数量(或单击加号按钮的数量),则滚动视图中的视图数量为
n*3

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

我还可以在hashmap中跟踪删除按钮的
id
s和这个PlayerDraft实例。这样,当单击某个删除按钮时,我可以使用它的
id
来查找相应的PlayerDraft实例,从而也可以在ScrollView中找到与这个播放器关联的视图的
id
s。

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

问题是调用
player\u display\u view.removeView(icontodele)
或任何类似方法都不起作用!
但是,调用
player\u display\u view.removeallview()
起作用

我发现了以下问题。
player\u display\u view
ScrollView始终只包含一个子元素,并且该子元素在其子元素数组中的位置为0。在运行期间,无论向ScrollView添加了多少视图,子元素的数量都不会改变,这让我很困惑:/。这些视图怎么会被显示如果他们没有被指定为ScrollView的子视图,则在ScrollView中显示(在我的手机上测试),调用方法
player\u display\u view。removeViewAt(0);
要删除ScrollView中的唯一子视图,不仅删除
ScrollView
的一个视图,还删除所有添加的视图

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


感谢您花费的时间,我真的很感激它

一般来说,
ScrollView
只包含一个子元素。如果您是动态(编程)的,这通常是一个容器(如
LinearLayout
RelativeLayout
),由
ScrollView
滚动将
视图
s添加到
滚动视图
,它可能创建了一个内部容器
布局
来保存添加的视图


您应该在
滚动视图中放置
布局
,并在
布局
中管理(添加/删除)视图
。然后“删除”代码应该可以工作。

谢谢,您的解决方案已经工作了!我引入了另一个变量,它是LinearLayout类型,并将其称为player\u display\u layout,通过访问ScrollView(这是默认创建的线性布局)的唯一子级来获得它。然后,在此线性布局上调用removeView(player\u display\u layout)产生期望的结果。谢谢!
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!");
    }
}