Android 列表视图和复选框问题
Android Listview & Checkbox Issue
我试图在每次单击列表视图项时选中我的复选框。我似乎无法让它工作。我已将代码缩减为我认为导致我的问题的代码:
MainActivity.java
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
//What I am trying which does not seem to work
if(checkBox.isChecked()){
fld.setToSelected(false);
Toast.makeText(getApplicationContext(), "Unchecked", Toast.LENGTH_SHORT).show();
}else{
fld.setToSelected(true);
Toast.makeText(getApplicationContext(), "Checked", Toast.LENGTH_SHORT).show();
}
handler.removeCallbacks(runnable);
super.onListItemClick(l, v, position, id);
AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.editTextComplete);
auto.setText("");
selectedFriend.add(names.get(position));
names.get(position);
}
FriendListData.java
boolean selected = false;
public boolean isSelected() {
return selected;
}
public void setToSelected(boolean selected) {
this.selected = selected;
}
FriendBaseAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if(convertView == null) {
convertView = inflater.inflate(R.layout.friend_item, null);
mViewHolder = new MyViewHolder();
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
mViewHolder.friendName = detail(convertView, R.id.friendName, myList.get(position).getFriend());
mViewHolder.checkedName = detail(convertView, R.id.checkedFriend, myList.get(position).isSelected());
return convertView;
}
private CheckBox detail(View v, int resId, boolean isChecked){
CheckBox checkBox = (CheckBox)v.findViewById(resId);
checkBox.setChecked(isChecked);
return checkBox;
}
friend_item.xml
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkedFriend"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:checked="false"
android:focusable="false"
android:clickable="false"/>
感谢所有帮助。如果需要更多代码,请询问。
如果您希望在点击整个列表项时点击您的 CheckBox
,您需要添加 android:duplicateParentState="true"
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkedFriend"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:checked="false"
android:duplicateParentState="true"/>
这将使每次单击列表项时所有标有 android:duplicateParentState=true
的子项也将收到单击事件。
请注意,如果您的 CheckBox
嵌套在多个视图组中,您必须为每个 ViewGroup
添加 duplicateParentState
标志。
在你的onListItemClick()中,至少要有这段代码:
checkBox = (CheckBox) v.findViewById(R.id.checkedFriend);
...
checkBox.setChecked(true);
请注意,我正在引用参数视图 (v) 以在列表视图行中找到正确的复选框。
我知道您正在削减代码,但目前我们正在尝试查找错误。所以完整的代码在这种情况下可能会节省时间。
我试图在每次单击列表视图项时选中我的复选框。我似乎无法让它工作。我已将代码缩减为我认为导致我的问题的代码:
MainActivity.java
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
//What I am trying which does not seem to work
if(checkBox.isChecked()){
fld.setToSelected(false);
Toast.makeText(getApplicationContext(), "Unchecked", Toast.LENGTH_SHORT).show();
}else{
fld.setToSelected(true);
Toast.makeText(getApplicationContext(), "Checked", Toast.LENGTH_SHORT).show();
}
handler.removeCallbacks(runnable);
super.onListItemClick(l, v, position, id);
AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.editTextComplete);
auto.setText("");
selectedFriend.add(names.get(position));
names.get(position);
}
FriendListData.java
boolean selected = false;
public boolean isSelected() {
return selected;
}
public void setToSelected(boolean selected) {
this.selected = selected;
}
FriendBaseAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if(convertView == null) {
convertView = inflater.inflate(R.layout.friend_item, null);
mViewHolder = new MyViewHolder();
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
mViewHolder.friendName = detail(convertView, R.id.friendName, myList.get(position).getFriend());
mViewHolder.checkedName = detail(convertView, R.id.checkedFriend, myList.get(position).isSelected());
return convertView;
}
private CheckBox detail(View v, int resId, boolean isChecked){
CheckBox checkBox = (CheckBox)v.findViewById(resId);
checkBox.setChecked(isChecked);
return checkBox;
}
friend_item.xml
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkedFriend"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:checked="false"
android:focusable="false"
android:clickable="false"/>
感谢所有帮助。如果需要更多代码,请询问。
如果您希望在点击整个列表项时点击您的 CheckBox
,您需要添加 android:duplicateParentState="true"
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkedFriend"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:checked="false"
android:duplicateParentState="true"/>
这将使每次单击列表项时所有标有 android:duplicateParentState=true
的子项也将收到单击事件。
请注意,如果您的 CheckBox
嵌套在多个视图组中,您必须为每个 ViewGroup
添加 duplicateParentState
标志。
在你的onListItemClick()中,至少要有这段代码:
checkBox = (CheckBox) v.findViewById(R.id.checkedFriend);
...
checkBox.setChecked(true);
请注意,我正在引用参数视图 (v) 以在列表视图行中找到正确的复选框。
我知道您正在削减代码,但目前我们正在尝试查找错误。所以完整的代码在这种情况下可能会节省时间。