【问题标题】:Not sure how to dynamically add checkboxes in 2 columns不确定如何在 2 列中动态添加复选框
【发布时间】:2012-08-02 12:05:32
【问题描述】:

我正在尝试将数据库中的信息显示为复选框。现在它工作正常,但在屏幕上放置了一列复选框。我想做的就是把它分成2个。

现在做什么:
项目1
项目2
项目3
项目4
项目5

我想要什么:
项目 1 项目 2
第 3 项第 4 项
项目5

最好是新的 2 列列表大小均匀,每个占屏幕的 50%,即使分配的文本长度不同。

我搜索了很多,尝试了 3 种不同的东西。还没有找到任何有效的东西。下面是我的代码(创建一列)。

private void listStudents()
{    
    st = (LinearLayout)findViewById(R.id.studTable);
    ml = (RelativeLayout)findViewById(R.id.main);

    ArrayList<ArrayList<String>> studentlst = new ArrayList<ArrayList<String>>();
    studentlst = db.getAllStudentsRowsAsArrays();
    final int sllen = studentlst.size();
    final String student[][] = new String[sllen][3];

    CheckBox cb[] = new CheckBox[sllen];
    TextView pemail[] = new TextView[sllen];
    int num = st.getChildCount();
    if(num != 0) st.removeAllViews();
    String tsl = sllen + "";
    nos.setText(tsl);
    for(int x=0; x < sllen; x++)
    {
        /************************
         *   student[x][case]   *
         *     case options     *
         *        0 = id        *
         *       1 = name       *
         *       2 = email      *
         ************************/
        String curstudent = studentlst.get(x).toString();
        student[x][0] = curstudent.substring(1,curstudent.indexOf(","));
        student[x][1] = curstudent.substring(curstudent.indexOf(" ")+1,curstudent.lastIndexOf(","));
        student[x][2] = curstudent.substring(curstudent.lastIndexOf(" ")+1, curstudent.length() - 1);
    } 
    Arrays.sort(student, new Comparator<String[]>() { 
        @Override 
        public int compare(String[] entry1, String[] entry2) { 
            String name1 = entry1[1]; 
            String name2 = entry2[1]; 
            return name1.compareTo(name2); 
        } 
    });     
    for(int x=0;x<sllen;x++)
    {
      cb[x] = new CheckBox(this);
      cb[x].setId(x+100);
      cb[x].setText(student[x][1]);
      pemail[x] = new TextView(this);
      pemail[x].setText(student[x][2]);
      pemail[x].setId(x+1000);
      pemail[x].setVisibility(View.INVISIBLE);
        st.addView(cb[x],x);
        ml.addView(pemail[x],x);
    }
}

XML 文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/lblmainselclass"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="82dp"
    android:layout_marginTop="7dp"
    android:text="@string/lblmainselectclass" />

<Spinner
    android:id="@+id/mainclassspinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/lblmainselclass" />

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="wrap_content"
    android:layout_height="250dp"
    android:layout_below="@+id/lblmainselstudents"
    android:layout_centerHorizontal="true" >

    <LinearLayout
        android:id="@+id/studTable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>
</ScrollView>

<TextView
    android:id="@+id/lblmainselstudents"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/mainclassspinner"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="5dp"
    android:text="@string/lblselectstud" />

<Button
    android:id="@+id/btnsend"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:text="@string/btnlblsend" />

<Spinner
    android:id="@+id/mainresponsespinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/btnsend"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="30dp" />

<TextView
    android:id="@+id/mainnumofstudents"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:text="@string/invis"
    android:visibility="invisible" />

<TextView
    android:id="@+id/classselected"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="@string/invis"
    android:visibility="invisible" />

<TextView
    android:id="@+id/responseselected"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="@string/invis"
    android:visibility="invisible" />

<TextView
    android:id="@+id/numchecked"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="@string/invis"
    android:visibility="invisible" />

【问题讨论】:

  • 你能展示你的xml布局吗?使用这么多数组有什么意义?
  • 添加了 XML,但不确定为什么看到它很重要。一切都是动态创建的。至于数组student[] 是来自数据库的信息,如块注释中所述,子字符串化为单个事物。 cb[] 是创建的复选框,pemail[] 是用于非相关目的的不可见文本视图
  • 主要问题是为什么你使用一个RelativeLayout(通过ID 找到)而不是为列表视图中的每个元素创建一个新的?另外我不得不说,如果你开始使用 ListView,你应该摆脱这些数组,ListView 提供了对其元素的轻松访问
  • 复选框被添加到 LinearLayout 中,唯一添加到 RL 的是不可见的持有者。我知道这不是一个优雅的解决方案,但正如我所说,我对 Android 开发非常陌生(这只是我的第二个应用程序,我以前从未使用过 Java 或 XML)。我只是希望找到一种简单的方法来制作两列而不是一列的复选框。

标签: android checkbox multiple-columns


【解决方案1】:

老问题,但我发现自己在这里,所以我会继续回答。有几种方法,但我是这样做的。

首先,获取您的数据并填充复选框的 ArrayList:

ArrayList<CheckBox> checkboxes = new ArrayList<CheckBox>();
for (String s : dataArray) {
    CheckBox cBox = new CheckBox(myContext); //or inflate it from xml if you have a defined style
    cBox.setText(s);
    checkboxes.add(cBox);
}

然后创建一个扩展 BaseAdapter 的类以及支持的静态类。假设您的 CheckBox ArrayList 是一个实例变量,我们会将数据绑定到适配器。如果没有,您可以通过这种方式在 BaseAdapter 类访问复选框中创建构造函数。

private class CheckboxGridAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        return checkboxes.size();
    }

    @Override
    public Object getItem(int pos) {
        return checkboxes.get(pos);
    }

    @Override
    public long getItemId(int pos) {
        return 0;
    }

    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {
        final ViewPlaceHolder holder;
        final CheckBox item = (CheckBox) getItem(pos);

        if (convertView == null) {
        holder = new ViewPlaceHolder();
        holder.cb = (CheckBox) item;
        convertView = holder.cb;

        convertView.setTag(holder);
        } else {
        holder = (ViewPlaceHolder) convertView.getTag();
        }

        return convertView;
    }
}

static class ViewPlaceHolder {
    CheckBox cb;
}

最后,回到您创建复选框的 ArrayList 的位置,创建一个 GridView(以编程方式或通过扩展 xml 资源),然后附加 BaseAdapter。不要忘记设置列数,毕竟这是这篇文章的重点。

GridView grid = new GridView(myContext);
grid.setNumColumns(2);
grid.setAdapter(new CheckboxGridAdapter());

【讨论】:

    【解决方案2】:

    如果您有很多条目,您应该使用自定义ListViewBaseAdapter 来提高效率。

    您可以在 SDK ApiDemos (android-sdk/samples/android-x/ApiDemos) 中找到很好的示例。

    【讨论】:

    • 我对 Android 开发很陌生,没有查看您引用的信息,我什至无法告诉您 BaseAdapter 是什么,哈哈。在我的胃里有一些食物后,我会看看你引用的内容,如果我能正常工作,我会将其标记为答案。谢谢
    • 您可以使用 GoogleApi 创建一个 AVD,当您运行模拟器时,您可以找到 ApiDemos 应用程序,您可以在其中执行所有示例的操作。
    • 另外,你说如果我有很多条目,那条路线是最有效的。没有办法知道会有多少条目。如果我不得不猜测,我会说平均可能是 10-30。但是,显然有任何数量的可能性,因为数据库是由用户创建的
    • 老实说,查看您提供的链接并没有帮助。我注意到那里的所有信息都令人困惑。以至于当我搜索如何做某事时,我会像瘟疫一样避开那个网站并寻找论坛答案哈哈。也许只是因为我对 Java/Android 太陌生了。有机会给我一个代码示例吗?适用于我的应用程序还是一般? (如果适用于我的应用程序,请解释我的代码的更改/添加,因为我不喜欢让其他人为我做事,我喜欢了解正在做的事情。)
    【解决方案3】:

    您应该使用GridView 而不是您的ScrollView。这样您就可以动态创建您的项目并拥有两列(或更多列)

    【讨论】:

    • 我得到处找一个gridview的例子,我以前没用过。
    • 您可能会找到更多 ListView 示例。这是相同的行为。您必须使用适配器并为适配器提供项目列表/数组。 getCount() 应该返回长度,getItem() 应该返回当前位置的项目,并且在绘制视图时调用 getView()。我发布的链接中还有一个示例。
    • 看RelativeLayout,我觉得ListView比较好用
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 2018-09-11
    • 2022-08-23
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多