1、概述
由于Listview 适配器的复用,会导致checkbox状态的混乱。这次用的控件并不是checkbox 而是ImageView,原因是checkbox的背景图片不适配,所以用Imageview代替了。但效果还是一样的。
效果图如下:
2、 实现
(1)javaBean类的isCheck用于保存选中状态
public class CheckBean {
private int number;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
private String title;
private boolean isCheck;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean check) {
isCheck = check;
}
}
(2)CheckAdapter适配器:
主要是控制显示隐藏图标,以及保存每个item状态,具体在代码中有注释
public class CheckAdapter extends BaseAdapter {
private List<CheckBean> mLists;
private LayoutInflater mInflater;
/**
* choiceLists 用于保存每次点击时候实体类集合的状态
*/
private List<CheckBean> choiceLists = new ArrayList<>();
private OnCheckListener listener;
public CheckAdapter(Context context, List<CheckBean> list) {
mLists = list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mLists.size();
}
@Override
public CheckBean getItem(int position) {
return mLists.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final CheckBean checkBean = mLists.get(position);
CheckHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_check, parent, false);
holder = new CheckHolder(convertView);
convertView.setTag(holder);
} else {
holder = (CheckHolder) convertView.getTag();
}
//根据实体类的isCheck状态显示与隐藏图标
if (checkBean.isCheck()) {
holder.ivCheck.setImageResource(R.mipmap.btn_check_box_selected);
} else {
holder.ivCheck.setImageResource(R.mipmap.btn_check_box_normal);
}
final CheckHolder finalHolder = holder;
holder.ivCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (checkBean.isCheck()) {
//设置显示下标
checkBean.setCheck(false);
finalHolder.ivCheck.setImageResource(R.mipmap.btn_check_box_normal);
//移除取消状态的实体类
if (!choiceLists.isEmpty() && choiceLists.contains(checkBean)) {
choiceLists.remove(checkBean);
}
} else {
checkBean.setCheck(true);
finalHolder.ivCheck.setImageResource(R.mipmap.btn_check_box_selected);
//添加选中状态的实体类
if (!choiceLists.contains(checkBean)) {
choiceLists.add(checkBean);
}
}
//把choiceLists回调给Activity处理
listener.senCheckListener(choiceLists);
}
});
holder.tvContent.setText(checkBean.getTitle());
holder.tvTitle.setText(String.valueOf(checkBean.getNumber()));
return convertView;
}
class CheckHolder {
TextView tvContent;
TextView tvTitle;
ImageView ivCheck;
CheckHolder(View convertView) {
tvContent = (TextView) convertView.findViewById(R.id.tvContent);
tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
ivCheck = (ImageView) convertView.findViewById(R.id.ivCheck);
}
}
/**
* 接口回调类
*/
public interface OnCheckListener {
void senCheckListener(List<CheckBean> list);
}
/**
* 设置回调类
*/
public void setOnCheckListener(OnCheckListener listener) {
this.listener = listener;
}
}
(3)处理每个item的逻辑
这里主要是获取item移除并打印
public class MainActivity extends AppCompatActivity {
private android.widget.ListView listView;
private android.widget.Button remove;
private List<CheckBean> lists = new ArrayList<>();
//用于添加回调过来的选中的实体类集合
private List<CheckBean> choiceLists = new ArrayList<>();
private CheckAdapter checkAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.remove = (Button) findViewById(R.id.remove);
this.listView = (ListView) findViewById(R.id.listView);
//添加的假数据
for (int i = 0; i < 21; i++) {
CheckBean checkBean = new CheckBean();
checkBean.setNumber(i);
checkBean.setTitle("这是内容");
lists.add(checkBean);
}
checkAdapter = new CheckAdapter(this, lists);
listView.setAdapter(checkAdapter);
//接口回调
checkAdapter.setOnCheckListener(new CheckAdapter.OnCheckListener() {
@Override
public void senCheckListener(List<CheckBean> list) {
//移除上一次数据
choiceLists.clear();
choiceLists.addAll(list);
}
});
remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//点击按钮时候处理数据
StringBuilder builder = new StringBuilder("删除了:");
for (int i = 0; i < choiceLists.size(); i++) {
CheckBean o = choiceLists.get(i);
if (lists.contains(o)) {
//获取当前行的内容
builder.append(o.getNumber());
builder.append(" ");
lists.remove(o);
}
}
builder.append("行");
//显示获取的数据
Toast.makeText(MainActivity.this, builder.toString(), Toast.LENGTH_SHORT).show();
checkAdapter.notifyDataSetChanged();
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.goockr.listviewcheck.MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/remove"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Remove" />
</LinearLayout>
item_check.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:background="@color/white"
android:paddingTop="12dp">
<ImageView
android:id="@+id/ivCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingBottom="12dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingTop="12dp"
android:src="@mipmap/btn_check_box_normal" />
<RelativeLayout
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ivCheck"
android:paddingBottom="12dp">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
tools:text="17666666666" />
<TextView
android:id="@+id/tvContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/tvTitle"
android:layout_below="@id/tvTitle"
android:layout_marginTop="5dp"
android:maxLines="1"
android:textSize="14sp"
tools:text="17666666666" />
</RelativeLayout>
</RelativeLayout>
注释基本都在代码当中,如果能够对adapter的getView()复用原理很好理解,相信很多人都能解决这个checkbox刷新界面的混乱问题。
以上就是整个app代码,如有错误,请指正。希望能帮到各位!