从具有可变长度/字段的数组中获取ID到类?

时间:2017-04-17 21:25:12

标签: java android arrays arraylist checkbox

我有一个public class User,其中有一个字段int userID。多个User对象存储在SharedFlat中的另一个类ArrayList<User>中。在Activity中,我想为User中的每个ArrayList<User>对象创建并显示一个CheckBox。由于ArrayList中的Users数量,以及CheckBoxes的数量是可变的,我使用了for循环和setID() - 方法来设置当前用户的userID object为相应CheckBox的ID:

  /* This method displays the CheckBoxes with the user names to the R.layout.new_payment_screen layout file */
private void createCheckboxes(SharedFlat flat) {
    // Find the layout and create a Checkbox Array to store all users
    LinearLayout ll = (LinearLayout) findViewById(R.id.who_received);
    final CheckBox[] checkBoxes = new CheckBox[flat.getNumberOfUsers()];
    // Create a new Checkbox for each user and set the users name to it
    for (int i = 0; i < checkBoxes.length; i++) {
        // create new checkboxes
        checkBoxes[i] = new CheckBox(this);
        // add checkboxes to the layout
        ll.addView(checkBoxes[i]);
        // set text of the CheckBox to be userName of current User object
        checkBoxes[i].setText(flat.getSpecificUserName(i));
        // set the ID to be the userID of the corresponding User
        checkBoxes[i].setId(flat.getSpecificUserID(i));
    }
}

这似乎有效,CheckBoxes和相应的userNames正确显示。 (问题:有更好的解决方案吗?)

现在到了真正的问题:我有一个按钮,它应该检查哪些CheckBox被检查(使用.isChecked()),因为我后来必须处理User个对象已被检查&#34;在调用按钮的onClick()方法时。 因为我必须得到已经检查过的完整User个对象,而不仅仅是userID个,所以有一种方法可以通过{{1}获得User对象变量User?有人会建议我怎样才能更好地解决这个问题? 我想我找到了至少找到已检查userID对象的userIDs的方法,但我不太确定这是否会适用于所有情况:

User

或者,如果某人有完全不同的解决方案 - 我只是&#34;只是&#34;需要创建CheckBox并为其附加ID,但我不知道有多少CheckBox(取决于 // Find the CheckBoxes within the LinearLayout and search them for the checked ones (= Receivers) LinearLayout ll = (LinearLayout) findViewById(R.id.who_received); final int checkBoxCount = ll.getChildCount(); ArrayList<Integer> userIdList = new ArrayList<Integer>(); for (int i = 0; i < checkBoxCount; i++) { CheckBox currentCheckBox = (CheckBox) ll.getChildAt(i); if (currentCheckBox.isChecked()) { userIdList.add(i); } } 的数量) 如果有人可以帮助我会很棒。你可以说,我对编程很新 - 新人:-) 谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你的一切都在正确的轨道上。对于第一个问题,使用for循环将是设置复选框的最佳方法。您可以做的一个优化是在显示它们时检查哪些被检查,如果这甚至是您的选项。否则,您只需检查哪些框有检查并将这些ID放入数组中,然后根据您的User数组检查该ID。

答案 1 :(得分:0)

我想我可能有一个解决你所谓的真正问题的方法,即访问<div class="top-nav"> <nav class="navbar navbar-inverse" role="navigation"> <div class="navbar-header"> <a class="navbar-brand" href="#"> <img src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" class="logo" /> </a> </div> <div class="collapse navbar-collapse "> <ul class="nav navbar-nav navbar-right"> <li id="search"> <input class="search-input" placeholder="Search" type="text" /> <a href="#"> <i class="glyphicon glyphicon-search"></i> </a> </li> <li> <div class="register-login"><a href="#">Login</a> \ <a href="#">Sign Up</a></div> </li> </ul> </div> </nav> </div> 附加的特定User对象的实例。好吧,它实际上是通过初始CheckBox循环中的CheckBox方法将对象附加到setTag()(没有引号)。您说for类中有User个对象的列表。所以我假设您已经(或可以添加)一个方法来获取SharedFlat对象的索引,如User。 然后,您可以在初始flat.getUser(i)循环中添加此行。

for

所以它看起来像这样。

checkBoxes[i].setTag(flat.getUser(i));

这样,您实际上将整个 /* This method displays the CheckBoxes with the user names to the R.layout.new_payment_screen layout file */ private void createCheckboxes(SharedFlat flat) { // Find the layout and create a Checkbox Array to store all users LinearLayout ll = (LinearLayout) findViewById(R.id.who_received); final CheckBox[] checkBoxes = new CheckBox[flat.getNumberOfUsers()]; // Create a new Checkbox for each user and set the users name to it for (int i = 0; i < checkBoxes.length; i++) { // create new checkboxes checkBoxes[i] = new CheckBox(this); // add checkboxes to the layout ll.addView(checkBoxes[i]); // set text of the CheckBox to be userName of current User object checkBoxes[i].setText(flat.getSpecificUserName(i)); // set the ID to be the userID of the corresponding User checkBoxes[i].setId(flat.getSpecificUserID(i)); checkBoxes[i].setTag(flat.getUser(i)); } } 对象附加到相应的User(而不是仅将它们与ID链接),稍后您可以使用CheckBox方法检索这些对象。每个getTag()。我不确定您是否需要CheckBox的ID才能与CheckBox匹配。

所以,你的下一段代码就是这个

userID

您将拥有// Find the CheckBoxes within the LinearLayout and search them for the checked ones (= Receivers) LinearLayout ll = (LinearLayout) findViewById(R.id.who_received); final int checkBoxCount = ll.getChildCount(); ArrayList<User> users = new ArrayList<User>(); for (int i = 0; i < checkBoxCount; i++) { CheckBox currentCheckBox = (CheckBox) ll.getChildAt(i); if (currentCheckBox.isChecked()) { users.add((User)currentCheckBox.getTag()); } } 个对象的列表,这些对象的用户名已被检查过User个。