1

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

现在做什么:
item1
item2
item3
item4
item5

我想要什么:
item1 item2
item3 item4
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" />

4

3 回答 3

2

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

首先,获取您的数据并填充复选框的 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());
于 2014-01-10T13:19:31.413 回答
0

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

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

于 2012-08-04T23:58:06.530 回答
0

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

于 2012-08-05T02:43:28.403 回答