前言
ListView带CheckBox实现单选在Android开发中会经常用到,通常的做法就是用一个bean记录CheckBox的状态,每次getView时去判断这个bean的状态。
演示如下:
实例代码:
Person:java bean数据
public class Person implements Serializable{
private String Title ; //每条item的数据
private boolean isChecked; //每条item的状态
public Person(String title){
Title = title;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
isChecked = checked;
}
}
MainActivity:在OnItemClickListener通过Person中的isChecked状态来控制CheckBox是否选中。
public class MainActivity extends AppCompatActivity {
@Bind(R.id.lv_main)
ListView mListView;//listview控件
List<Person> datas = new ArrayList();//数据集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
ButterKnife.bind(this);
//创建数据
for(int i = 0;i<20;i++){
datas.add(new Person("张三"+i));
}
final MyAdapter myAdapter = new MyAdapter(this);
myAdapter.setDatas(datas);
mListView.setAdapter(myAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
int currentNum = -1;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
for(Person person : datas){ //遍历list集合中的数据
person.setChecked(false);//全部设为未选中
}
if(currentNum == -1){ //选中
datas.get(position).setChecked(true);
currentNum = position;
}else if(currentNum == position){ //同一个item选中变未选中
for(Person person : datas){
person.setChecked(false);
}
currentNum = -1;
}else if(currentNum != position){ //不是同一个item选中当前的,去除上一个选中的
for(Person person : datas){
person.setChecked(false);
}
datas.get(position).setChecked(true);
currentNum = position;
}
Toast.makeText(parent.getContext(),datas.get(position).getTitle(),Toast.LENGTH_SHORT).show();
myAdapter.notifyDataSetChanged();//刷新adapter
}
});
}
}
MyAdapter:在Adapter适配器中贴出了重要的getView代码,在getView中根据position位置状态及javaBean做状态判断。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//listView优化部分
ViewHolder mViewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_checkbox, parent, false);
mViewHolder = new ViewHolder(convertView);
convertView.setTag(mViewHolder);
}else {
mViewHolder = (ViewHolder) convertView.getTag();
}
//判断CheckBox的状态
if(mDatas.get(position).isChecked()){
mViewHolder.mCbCheckbox.setChecked(true);//选中
}else {
mViewHolder.mCbCheckbox.setChecked(false);//未选中
}
mViewHolder.mTvTitle.setText(mDatas.get(position).getTitle());
return convertView;
}
//listview优化使用的holder
static class ViewHolder {
@Bind(R.id.tv_title)
TextView mTvTitle;
@Bind(R.id.cb_checkbox)
CheckBox mCbCheckbox;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
Item_checkbox.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="我是谁"/>
<CheckBox
android:id="@+id/cb_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_margin="10dp"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
/>
</RelativeLayout>