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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="CheckAll"
android:text="全选" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:onClick="ReverseCheck"
android:text="反选" />
<TextView
android:id="@+id/checkNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="选中 0 个" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
//MainActivity 方法中的代码
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerview;
private TextView checkNumber;
private RecyclerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
checkNumber = (TextView) findViewById(R.id.checkNumber);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerview.setLayoutManager(linearLayoutManager);
adapter = new RecyclerAdapter();
recyclerview.setAdapter(adapter);
//自定义接口,把选中的个数传过来
adapter.setOnCheckBoxClickListener(new RecyclerAdapter.OnCheckBoxClickListener() {
@Override
public void onClick(View view, int num) {
checkNumber.setText("选中 " + num + " 个");
}
});
}
//全选按钮的点击事件
public void CheckAll(View view) {
//调用自定义接口方法,设置全选
adapter.CheckedAllItem();
//调用自定义的方法,计算选中的个数,然后设置到TextView上面
int checkedNumber = adapter.getCheckedNumber();
checkNumber.setText("选中 " + checkedNumber + " 个");
}
//反选按钮的点击事件
public void ReverseCheck(View view) {
//调用自定义接口方法,设置反选
adapter.ReverseCheckItem();
//调用自定义的方法,计算选中的个数,然后设置到TextView上面
int checkedNumber = adapter.getCheckedNumber();
checkNumber.setText("选中 " + checkedNumber + " 个");
}
}
//RecyclerView适配器,完成全选,单选,和计算选中的个数,以及单选
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private HashMap<Integer, Boolean> map;
private ArrayList<String> list;
public RecyclerAdapter() {
list = new ArrayList<>();
map = new HashMap<>();
for (int i = 0; i < 30; i++) {
list.add("item" + i);
map.put(i, false);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.item_tv.setText(list.get(position));
holder.checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
map.put(position, !map.get(position));
// CheckOleyOne(position);
//点击的时候计算选中的个数
int checkedNumber = getCheckedNumber();
notifyDataSetChanged();
mOnCheckBoxClickListener.onClick(v, checkedNumber);
}
});
holder.checkbox.setChecked(map.get(position));
}
private OnCheckBoxClickListener mOnCheckBoxClickListener;
public interface OnCheckBoxClickListener {
void onClick(View view, int num);
}
public void setOnCheckBoxClickListener(OnCheckBoxClickListener mOnCheckBoxClickListener) {
this.mOnCheckBoxClickListener = mOnCheckBoxClickListener;
}
//得到选中的数量
public int getCheckedNumber() {
int Number = 0;
Set<Map.Entry<Integer, Boolean>> set = map.entrySet();
//判断是否有未选中的,如果有未选中isChecked = true;退出循环
for (Map.Entry<Integer, Boolean> entry : set) {
if (entry.getValue() && Number <= list.size()) {
Number += 1;
}
}
return Number;
}
//全选方法
public void CheckedAllItem() {
Set<Map.Entry<Integer, Boolean>> set = map.entrySet();
boolean isChecked = false;
//判断是否有未选中的,如果有未选中isChecked = true;退出循环
for (Map.Entry<Integer, Boolean> entry : set) {
if (entry.getValue() == false) {
isChecked = true;
break;
}
}
//如果有未选中的 isChecked = true;就把所有item的checkbox设置成true,反之就是全选中了.设置成全不选中
for (Map.Entry<Integer, Boolean> entry : set) {
entry.setValue(isChecked);
}
getCheckedNumber();
notifyDataSetChanged();
}
//反选方法
public void ReverseCheckItem() {
Set<Map.Entry<Integer, Boolean>> entries = map.entrySet();
for (Map.Entry<Integer, Boolean> set : entries) {
set.setValue(!set.getValue());
}
getCheckedNumber();
notifyDataSetChanged();
}
//单选
public void CheckOleyOne(int position) {
Set<Map.Entry<Integer, Boolean>> entries = map.entrySet();
for (Map.Entry<Integer, Boolean> entry : entries) {
entry.setValue(false);
}
map.put(position, true);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView item_tv;
private CheckBox checkbox;
public MyViewHolder(View itemView) {
super(itemView);
item_tv = (TextView) itemView.findViewById(R.id.item_tv);
checkbox = (CheckBox) itemView.findViewById(R.id.checkbox);
}
}
}