1.第一种方法 直接上代码
private Map<Integer,Boolean> map=new HashMap<>();// 存放已被选中的CheckBox
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
getItem(position);
if (convertView==null){
viewHolder=new ViewHolder();
convertView= LinearLayout.inflate(context, R.layout.list_item, null);
viewHolder.text=convertView.findViewById(R.id.tv);
viewHolder.checkbox=convertView.findViewById(R.id.checkbox);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
//最主要的就是这个存储和下面的那个判断
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked==true){
map.put(position,true);
}else {
map.remove(position);
}
}
});
//没错你看到了 就是这个
if(map!=null&&map.containsKey(position)){
viewHolder.checkbox.setChecked(true);
}else {
viewHolder.checkbox.setChecked(false);
}
viewHolder.text.setText(str.get(position));
return convertView;
}
static class ViewHolder {
TextView text;
CheckBox checkbox;
}
2.第二种方法就是将数据存在实体类里面 直接上的代码
先创建实体类
public class PeopleModel {
private String name;//这个是名称
private Boolean ischeck;//是否选中
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getIscheck() {
return ischeck;
}
public void setIscheck(Boolean ischeck) {
this.ischeck = ischeck;
}
@Override
public String toString() {
return "PeopleModel{" +
"name='" + name + '\'' +
", ischeck=" + ischeck +
'}';
}
}
然后写适配器 1-4步
public class adapter extends BaseAdapter {
private Context context;
// private List<String> arr;
// private HashMap<Integer,Boolean> map=new HashMap<>();
private List<PeopleModel> peopleModels;//第1步
public adapter(Context context, List<PeopleModel> peopleModels) {
this.context = context;
this.peopleModels = peopleModels;
}
@Override
public int getCount() {
return peopleModels.size();
}
@Override
public Object getItem(int position) {
return peopleModels.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView==null){
viewHolder=new ViewHolder();
convertView=LinearLayout.inflate(context, R.layout.item_lv, null);
viewHolder.tv=convertView.findViewById(R.id.tv);
viewHolder.cb=convertView.findViewById(R.id.cb);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.cb.setOnClickListener(new View.OnClickListener() {//第2步
@Override
public void onClick(View v) {
peopleModels.get(position).setIscheck(viewHolder.cb.isChecked());
}
});
if (peopleModels != null) {//第3步
final PeopleModel mPeopleModel = peopleModels.get(position);
if (mPeopleModel != null) {
if (mPeopleModel.getIscheck()!=null) {
viewHolder.cb.setChecked(mPeopleModel.getIscheck());
}else {
viewHolder.cb.setChecked(false);
}
if (!TextUtils.isEmpty(mPeopleModel.getName())) {
viewHolder.tv.setText(mPeopleModel.getName());
}
}
}
viewHolder.tv.setText(peopleModels.get(position).getName());//第4步
// viewHolder.cb.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// if(!map.containsKey(position)){
// map.put(position,viewHolder.cb.isChecked());
// }else {
// map.remove(position);
// }
// }
// });
// if(map!=null&&map.containsKey(position)){
// viewHolder.cb.setChecked(map.containsKey(position));
// }else {
// viewHolder.cb.setChecked(false);
// }
return convertView;
}
static class ViewHolder{
private TextView tv;
private CheckBox cb;
}
}
然后看一下主函数 这里面用了一个刷新框架 implementation 'com.jwenfeng.pulltorefresh:library:1.2.7'
public class MainActivity extends AppCompatActivity {
PullToRefreshLayout pull;
ListView lv;
List<PeopleModel> arr=new ArrayList<>();//第1步
adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = findViewById(R.id.lv);
pull=findViewById(R.id.pull);
adapter = new adapter(MainActivity.this, arr);
for (int i = 0; i <10 ; i++) {//第2步
PeopleModel peopleModel = new PeopleModel();
peopleModel.setName("我是"+i);
arr.add(peopleModel);
}
lv.setAdapter(adapter);
pull.setRefreshListener(new BaseRefreshListener() {
@Override
public void refresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 结束刷新
pull.finishRefresh();
}
}, 2000);
}
@Override
public void loadMore() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i <10 ; i++) {//第3步
PeopleModel peopleModel = new PeopleModel();
peopleModel.setName("我是"+i);
arr.add(peopleModel);
}
adapter.notifyDataSetChanged();
// 结束加载更多
pull.finishLoadMore();
}
}, 2000);
}
});
}
}
主布局
<LinearLayout
android:orientation="vertical" 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"
tools:context=".MainActivity">
<com.jwenfeng.library.pulltorefresh.PullToRefreshLayout
android:id="@+id/pull"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv"></ListView>
</com.jwenfeng.library.pulltorefresh.PullToRefreshLayout>
</LinearLayout>
item布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="aaaaaa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"/>
<CheckBox
android:layout_alignParentRight="true"
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
效果图: 可以看到没有任何重复选项