我有一个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);
}
}
的数量)
如果有人可以帮助我会很棒。你可以说,我对编程很新 - 新人:-)
谢谢!
答案 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
个。