这个小demo主要是实现ListView中CheckBox每次只能选中一个,当选中另一个Item中的CheckBox时,其他ListView的Item中的CheckBox都变为没有选中的状态,以及ListView的视图复用,而且CheckBox没有图片错位的问题。
首先是效果图:
条目5被选中
条目7被选中时,其他条目都变为没有选中的状态
废话不多少,还是直接上代码:
首先是MainActivity.java的代码:
public class MainActivity extends Activity {
private ListView listView;
private List<ItemObject> listData;
private MyAdapter adapter;
private MainActivity mMainActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMainActivity = this;
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
listData = new ArrayList<ItemObject>();
for (int i = 0; i < 30; i++) {
ItemObject bank = new ItemObject();
bank.setCheck(false);
bank.setName("条目"+i);
listData.add(bank);
}
adapter = new MyAdapter();
listView.setAdapter(adapter);
}
public class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
if(listData == null){
return 0;
}
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CheckBox checkBox = null;
if(convertView == null){
convertView = View.inflate(mMainActivity, R.layout.item_adapter, null);
checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
convertView.setTag(checkBox);
}else{
checkBox = (CheckBox) convertView.getTag();
}
final ItemObject itemObject = listData.get(position);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
for (int i = 0; i < listData.size(); i++) {
listData.get(i).setCheck(false);
}
itemObject.setCheck(isChecked);
adapter.notifyDataSetChanged();
}
}
});
checkBox.setChecked(itemObject.isCheck());
checkBox.setText(itemObject.getName());
return convertView;
}
}
}
其中用到了一个bean对象ItemObject:
public class ItemObject {
private String name;
private boolean isCheck;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean isCheck) {
this.isCheck = isCheck;
}
}
然后是布局文件activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
以及适配器用到的布局文件item_adapter.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<CheckBox android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="条目名称"
android:gravity="center"/>
</RelativeLayout>
基本到这里就实现了我们要的效果,另外附上demo下载:点击打开链接