RecyclerView的单选和多选
程序员文章站
2022-05-31 11:45:55
...
转自:https://blog.csdn.net/chengfu116/article/details/75291344
RecyclerView单选
- Adapter类
public class SingleAdapter extends RecyclerView.Adapter {
private List<String> datas;
private int selected = -1;
public SingleAdapter(List<String> datas) {
this.datas = datas;
}
private OnItemClickLitener mOnItemClickLitener;
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
{
this.mOnItemClickLitener = mOnItemClickLitener;
}
public void setSelection(int position){
this.selected = position;
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new SingleViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof SingleViewHolder){
final SingleViewHolder viewHolder = (SingleViewHolder) holder;
String name = datas.get(position);
viewHolder.mTvName.setText(name);
if(selected == position){
viewHolder.mCheckBox.setChecked(true);
viewHolder.itemView.setSelected(true);
} else {
viewHolder.mCheckBox.setChecked(false);
viewHolder.itemView.setSelected(false);
}
if (mOnItemClickLitener != null)
{
viewHolder.itemView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mOnItemClickLitener.onItemClick(viewHolder.itemView, viewHolder.getAdapterPosition());
}
});
}
}
}
@Override
public int getItemCount() {
return datas.size();
}
class SingleViewHolder extends RecyclerView.ViewHolder{
TextView mTvName;
CheckBox mCheckBox;
public SingleViewHolder(View itemView) {
super(itemView);
mTvName = (TextView) itemView.findViewById(R.id.tv_name);
mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- Activity类
public class SingleActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single);
initData();
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
final SingleAdapter adapter = new SingleAdapter(datas);
mRecyclerView.setAdapter(adapter);
adapter.setOnItemClickLitener(new OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
adapter.setSelection(position);
}
@Override
public void onItemLongClick(View view, int position) {
}
});
}
private void initData() {
datas = new ArrayList<>();
for (int i=0; i<20; i++) {
datas.add("测试"+i);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
RecyclerView多选
- Adapter类
public class MultiAdapter extends RecyclerView.Adapter {
private List<String> datas;
public static HashMap<Integer, Boolean> isSelected;
public MultiAdapter(List<String> datas) {
this.datas = datas;
init();
}
// 初始化 设置所有item都为未选择
public void init() {
isSelected = new HashMap<Integer, Boolean>();
for (int i = 0; i < datas.size(); i++) {
isSelected.put(i, false);
}
}
private OnItemClickLitener mOnItemClickLitener;
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
{
this.mOnItemClickLitener = mOnItemClickLitener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MultiViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof MultiViewHolder){
final MultiViewHolder viewHolder = (MultiViewHolder) holder;
String name = datas.get(position);
viewHolder.mTvName.setText(name);
viewHolder.mCheckBox.setChecked(isSelected.get(position));
viewHolder.itemView.setSelected(isSelected.get(position));
if (mOnItemClickLitener != null)
{
viewHolder.itemView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
mOnItemClickLitener.onItemClick(viewHolder.itemView, viewHolder.getAdapterPosition());
}
});
}
}
}
@Override
public int getItemCount() {
return datas.size();
}
class MultiViewHolder extends RecyclerView.ViewHolder{
TextView mTvName;
CheckBox mCheckBox;
public MultiViewHolder(View itemView) {
super(itemView);
mTvName = (TextView) itemView.findViewById(R.id.tv_name);
mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- Activity类
public class MultiActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private TextView mTvCount;
private List<String> datas;
private List<String> selectDatas = new ArrayList<>();
private MultiAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multi);
initData();
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mTvCount = (TextView) findViewById(R.id.tv_count);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new MultiAdapter(datas);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickLitener(new OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
if(!mAdapter.isSelected.get(position)){
mAdapter.isSelected.put(position, true); // 修改map的值保存状态
mAdapter.notifyItemChanged(position);
selectDatas.add(datas.get(position));
}else {
mAdapter.isSelected.put(position, false); // 修改map的值保存状态
mAdapter.notifyItemChanged(position);
selectDatas.remove(datas.get(position));
}
mTvCount.setText("已选中"+selectDatas.size()+"项");
}
@Override
public void onItemLongClick(View view, int position) {
}
});
}
/**
* 全选
* @param view
*/
public void all(View view){
selectDatas.clear();
for (int i = 0; i < datas.size(); i++) {
mAdapter.isSelected.put(i, true);
selectDatas.add(datas.get(i));
}
mAdapter.notifyDataSetChanged();
mTvCount.setText("已选中"+selectDatas.size()+"项");
}
/**
* 反选
* @param view
*/
public void inverse(View view){
for (int i=0; i<datas.size(); i++) {
if(mAdapter.isSelected.get(i)){
mAdapter.isSelected.put(i,false);
selectDatas.remove(datas.get(i));
} else {
mAdapter.isSelected.put(i,true);
selectDatas.add(datas.get(i));
}
}
mAdapter.notifyDataSetChanged();
mTvCount.setText("已选中"+selectDatas.size()+"项");
}
/**
* 取消已选
* @param view
*/
public void cancel(View view){
for (int i=0; i<datas.size(); i++) {
if(mAdapter.isSelected.get(i)){
mAdapter.isSelected.put(i,false);
selectDatas.remove(datas.get(i));
}
}
mAdapter.notifyDataSetChanged();
mTvCount.setText("已选中"+selectDatas.size()+"项");
}
private void initData() {
datas = new ArrayList<>();
for (int i=0; i<20; i++) {
datas.add("测试"+i);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- item布局
<?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="wrap_content"
android:background="@drawable/bg_selector"
android:descendantFocusability="blocksDescendants"
android:padding="10dp">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Android"/>
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"/>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
效果图:
demo地址:https://github.com/CoderCF/SingleAndMultiChoiceRecyclerView
推荐阅读
-
RecyclerView的加载和刷新(使用优秀的第三方库SmartRefreshLayout)
-
ElementUI的el-select怎样实现下拉多选并实现给下拉框赋值和获取值
-
下拉多选框和如何获取选中的值
-
php表单在修改时如何显示多选框的值包含选中的和没选中的
-
,帮忙看看上面代码哪里异常了 JS显示Stack overflow at line:0 复选框全选和单选的时候也有点有关问题
-
Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除
-
JS获取下拉框显示值和判断单选按钮的方法_javascript技巧
-
Android实现单选与多选对话框的代码
-
单选框的全选、全不选、部分选和获取选中值
-
Android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入的实例代码