【问题标题】:Android: ListView with CheckboxAndroid:带复选框的 ListView
【发布时间】:2016-02-03 03:48:07
【问题描述】:

我已经为这个问题搜索了高低,但找不到具体的东西。

基本上,我在 ListView 中有一个朋友列表,我试图通过选择特定的朋友来创建一个组。为此,我创建了一个带有 SearchView 和 ListView 的 Activity。搜索将过滤并显示我要添加的朋友。为此,我想使用一个复选框。然后,所有“选中”的朋友将被传递到另一个可以完成群组创建的活动。

活动的布局有一个ListView。 我已经编写了我自己的适配器,并且这个适配器为 ListView 增加了行布局。适配器的布局有一个CheckBox,我已明确添加。

所以活动布局有:ListView 行布局有:TextView 和 Checkbox

但我遇到了以下问题: 1.尝试在滚动/搜索列表视图时保持选中复选框,因为视图刷新并且复选框被重新创建为未选中 - 我暂时通过维护单击的复选框列表解决了这个问题。我在适配器的getView() 方法中执行此操作。 2.试图判断checkbox属于ListView的哪一行。我需要这个来创建我的朋友群。 3.允许编辑选择的朋友列表 - 在创建组之前添加/删除朋友。

这是一个图解表示:

编辑

添加另一个图表以显示其工作原理。

所以从第一个活动开始,我去第二个活动搜索和添加朋友。一旦我选择了我的朋友,当我点击“确定”按钮时,我会将列表发送回我的第一个活动。

【问题讨论】:

    标签: android listview checkbox android-listview


    【解决方案1】:

    我终于明白了。

    如前所述,当复选框被选中时,我不确定如何将“控制”传递回活动。这是一个问题,因为复选框是由适配器膨胀的布局的一部分。

    在适配器中,我将其设置为将“控制”传递回活动以处理复选框的检查:

    checkbox.setOnCheckedChangeListener((SearchFriendActivity) context);
    

    并且在 SearchFriendActivity 中,复选框的勾选可以通过以下方式处理:

    @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    
            Log.i(TAG, "Inside onCheckedChanged");
    
            //The below code line will get the position of the row item    
            int pos = friendlistview.getPositionForView(buttonView);
    
            if(pos != ListView.INVALID_POSITION)
            {
                //Logic Here
            }
        }
    

    记得在活动中implements CompoundButton.OnCheckedChangeListener

    关于这个的一个简洁的小教程 here

    【讨论】:

      【解决方案2】:

      AlertDialog 方法setMultiChoiceItems() 您可以使用复选框列表进行对话框。有帮助吗?

      【讨论】:

        【解决方案3】:

        我不知道它是否有效,因为我现在不在我的开发电脑上,我无法向您发布代码。但是试试这个:

        1 实现复选框事件监听器(我不确定可能是onCheckChanged())并将复选框值或索引存储在列表中(更好地使用索引)

        2 如果你有存储索引,你可以知道哪个复选框属于哪一行。如果不是,也许您应该将 setTag() 设置为行或行的 TextView,以便您可以在意图与下一个活动之前进行比较。

        3 你没有告诉我们该组使用什么视图。很难回答,但我认为你从 getIntent() 获得的价值可能是一个列表,所以你可以用删除按钮的一些视图显示它。因此,只需在创建组之前从列表中删除值。 为了添加更多朋友,您可能应该将列表意图返回到第一个活动并选中它选中的复选框并允许用户再次选中/取消选中它。之后,再次将其用于该组活动。

        【讨论】:

        • 复选框是行布局的一部分,因此由适配器膨胀。 listview 是 Activity 布局的一部分,并被 Activity 破坏。
        • 你在告诉我什么?我试着回答你的问题,而不是问你问题。
        【解决方案4】:

        这是一项简单的任务,请按照以下步骤操作:

        1. 制作一个布局 xml 文件并定义单个复选框的外观
        2. 创建一个列表视图。
        3. 填充列表视图,因为列表视图是为简单的文本视图填充的。

        如果您对填充列表视图没有足够的了解,请尝试此链接

        http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html

        如果您遇到任何问题,请告诉我。

        编码愉快!!

        【讨论】:

        • 我遇到的问题是检测列表视图中选择的行并将其发送回活动。由于复选框是行布局的一部分,我不确定如何在我的活动类而不是适配器类中“访问”它。
        • CheckBox checkBox= ( CheckBox ) findViewById( R.id.cb); checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if ( isChecked ) { // 执行逻辑 } } });
        • 选中复选框时获取一个集合并将一个项目添加到集合中,当复选框未选中时从集合中删除该项目。
        猜你喜欢
        • 2011-09-15
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多