您的位置:首页 > 其它

RecyclerView上放置CheckBox实现全选和单选,不选功能。

2017-06-20 15:42 585 查看


res文件下的代码:

(1)anim文件夹——listanim.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">

<scale
android:duration="250"
android:fromXScale="100%"
android:fromYScale="0%"
android:pivotX="0%"
android:pivotY="0%"
android:toXScale="100%"
android:toYScale="100%" />
</set>


(2)layout—–activity_main.xml,list_item.xml

<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />

<Button
android:id="@+id/commit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="确定" />


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="
4000
horizontal">

<TextView
android:id="@+id/tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceLarge" />

<CheckBox
android:id="@+id/cb"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginRight="10dp"
android:visibility="invisible" />
</LinearLayout>


(3)menu文件夹下的———main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/all"
android:title="全选"
yourapp:showAsAction="always" />
<item
android:id="@+id/no_all"
android:title="全不选"
yourapp:showAsAction="always" />
</menu>


MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private List<String> list;
private ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
findViewById(R.id.commit).setOnClickListener(this);
initData();
//布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(manager);
recyclerView.setHasFixedSize(true);
adapter = new ListAdapter(list, this);
recyclerView.setAdapter(adapter);
//添加分割线
recyclerView.addItemDecoration(new MyDecoration(this, MyDecoration.VERTICAL_LIST));
adapter.setRecyclerViewOnItemClickListener(new ListAdapter.RecyclerViewOnItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
//设置选中的项
adapter.setSelectItem(position);
}

@Override
public boolean onItemLongClickListener(View view, int position) {
adapter.setShowBox();
//设置选中的项
adapter.setSelectItem(position);
adapter.notifyDataSetChanged();
return true;
}
});
}

@Override
public void onClick(View v) {
//获取你选中的item
Map<Integer, Boolean> map = adapter.getMap();
for (int i = 0; i < map.size(); i++) {
if (map.get(i)) {
Log.d("TAG", "你选了第:" + i + "项");
}
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
//全选
case R.id.all:
Map<Integer, Boolean> map = adapter.getMap();
for (int i = 0; i < map.size(); i++) {
map.put(i, true);
adapter.notifyDataSetChanged();
}
break;
//全不选
case R.id.no_all:
Map<Integer, Boolean> m = adapter.getMap();
for (int i = 0; i < m.size(); i++) {
m.put(i, false);
adapter.notifyDataSetChanged();
}
break;
}
return super.onOptionsItemSelected(item);
}

/**
* 为列表添加测试数据
*/
private void initData() {
list=new ArrayList<>();
for (int i=0;i<100;i++) {
list.add("当前条目是"+i);
}
}
}


ListAdapter:

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>
implements View.OnClickListener, View.OnLongClickListener {
//数据源
private List<String> list;
private Context context;
//是否显示单选框,默认false
private boolean isshowBox = true;
// 存储勾选框状态的map集合
private Map<Integer, Boolean> map = new HashMap<>();
//接口实例
private RecyclerViewOnItemClickListener onItemClickListener;

public ListAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
initMap();
}

//初始化map集合,默认为不选中
private void initMap() {
for (int i = 0; i < list.size(); i++) {
map.put(i, false);
}
}

//视图管理
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private CheckBox checkBox;
private View root;

public ViewHolder(View root) {
super(root);
this.root = root;
title = (TextView) root.findViewById(R.id.tv);
checkBox = (CheckBox) root.findViewById(R.id.cb);
}
}

@Override
public int getItemCount() {
return list.size();
}

//绑定视图管理者
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.title.setText(list.get(position));
//长按显示/隐藏
if (isshowBox) {
holder.checkBox.setVisibility(View.VISIBLE);
} else {
holder.checkBox.setVisibility(View.INVISIBLE);
}
Animation animation = AnimationUtils.loadAnimation(context, R.anim.list_anim);
//设置checkBox显示的动画
if (isshowBox)
holder.checkBox.startAnimation(animation);
//设置Tag
holder.root.setTag(position);
//设置checkBox改变监听
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//用map集合保存
map.put(position, isChecked);
}
});
// 设置CheckBox的状态
if (map.get(position) == null) {
map.put(position, false);
}
holder.checkBox.setChecked(map.get(position));
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View root = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
ViewHolder vh = new ViewHolder(root);
//为Item设置点击事件
root.setOnClickListener(this);
root.setOnLongClickListener(this);
return vh;
}

//点击事件
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
//注意这里使用getTag方法获取数据
onItemClickListener.onItemClickListener(v, (Integer) v.getTag());
}
}

//长按事件
@Override
public boolean onLongClick(View v) {
//不管显示隐藏,清空状态
initMap();
return onItemClickListener != null && onItemClickListener.onItemLongClickListener(v, (Integer) v.getTag());
}

//设置点击事件
public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}

//设置是否显示CheckBox
public void setShowBox() {
//取反
isshowBox = !isshowBox;
}

//点击item选中CheckBox
public void setSelectItem(int position) {
//对当前状态取反
if (map.get(position)) {
map.put(position, false);
} else {
map.put(position, true);
}
notifyItemChanged(position);
}

//返回集合给MainActivity
public Map<Integer, Boolean> getMap() {
return map;
}

//接口回调设置点击事件
public interface RecyclerViewOnItemClickListener {
//点击事件
void onItemClickListener(View view, int position);

//长按事件
boolean onItemLongClickListener(View view, int position);
}
}


MyDecoration

public class MyDecoration extends RecyclerView.ItemDecoration {

private Drawable mDivider;
private int mOrientation;
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

//我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置
public static final int[] ATRRS = new int[]{android.R.attr.listDivider};

public MyDecoration(Context context, int orientation) {
final TypedArray ta = context.obtainStyledAttributes(ATRRS);
this.mDivider = ta.getDrawable(0);
ta.recycle();
setOrientation(orientation);
}

//设置屏幕的方向
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == HORIZONTAL_LIST) {
drawVerticalLine(c, parent, state);
} else {
drawHorizontalLine(c, parent, state);
}
}

//画横线, 这里的parent其实是显示在屏幕显示的这部分
public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
//获得child的布局信息
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
//Log.d("wnw", left + " " + top + " "+right+"   "+bottom+" "+i);
}
}

//画竖线
public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);

//获得child的布局信息
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}

//由于Divider也有长宽高,每一个Item需要向下或者向右偏移
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == HORIZONTAL_LIST) {
//画横线,就是往下偏移一个分割线的高度
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
//画竖线,就是往右偏移一个分割线的宽度
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}


Demo下载地址:https://github.com/lu3896/RecyclerView_Checkbox
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐