不确定如何在2列中动态添加复选框

时间:2012-08-04 23:15:42

标签: android checkbox multiple-columns

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

现在做什么:
物品1
ITEM2
项目3
ITEM4
ITEM5

我想要的:
item1 item2
item3项目4 ITEM5

优选地,新的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" />

3 个答案:

答案 0 :(得分:1)

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

首先,获取数据并填充Checkbox的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;
}

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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