先来点思路:
name是显示内容,title是标记 parentItem(我们点击的那些) 的name 是 chiledItem(我们要隐藏的那些item)的title 然后在adapter中设置个map<String ,Boolean> 如果点击 parentItem 我们就把它的name作为key 折叠/展开的状态作为value保存,然后在根据 状态来来判断是否要隐藏item
以上就是我想到的,我就是简单做了一下,大家有好的做法,可以优化优化。看了网上的一些例子,说的不是很全面,自己就写了点,希望能帮到大家,
效果如上图,点击title显示部分 再点击收起,废话不多说 直接上代码:
1、Recycle adapter核心代码:
List<GroundBean> mDatas;
Map<String,Boolean> map;
public GroundAdapter(Context context, List<GroundBean> mDatas) {
super(context);
this.mDatas = mDatas;
map = new HashMap<>();
}
@NonNull
@Override
public GroundHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new GroundHolder(initViewHolder(parent, R.layout.item_grount));
}
@Override
public int getItemCount() {
return mDatas.size();
}
@Override
public void onBindViewData(GroundHolder holder, int position) {
final GroundBean bean = mDatas.get(position);
boolean isGone= map.get(bean.getTitle())==null?true:map.get(bean.getTitle());
holder.itemName.setText(bean.getName());
if (!"".equals(bean.getTitle())){
holder.setVisibility(isGone);
holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.white));
}else {
//这个一定在显示的item设置了,不然出现刷新后一些item也被隐藏(估计就是复用的问题了)
holder.setVisibility(false);
holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.colorAccent));
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ("".equals(bean.getTitle())){
boolean isSelect = map.get(bean.getName())==null?true:map.get(bean.getName());
map.put(bean.getName(),!isSelect);
notifyDataSetChanged();
}
}
});
}
//这是控制网格布局一个item占多少列
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (!"".equals(mDatas.get(position).getTitle())){
return 1;
}else {
return 3;
}
}
});
}
}
2、Holder :
public class GroundHolder extends RecycleAdapter.ViewHolder{
@BindView(R.id.item_name)
TextView itemName;
public GroundHolder(View itemView) {
super(itemView);
}
//主要是这设置item的大小从而隐藏和显示
public void setVisibility(boolean isGone){
RecyclerView.LayoutParams param = (RecyclerView.LayoutParams)itemView.getLayoutParams();
if (isGone){
param.height = 0;
param.width = 0;
}else{
param.height = LinearLayout.LayoutParams.WRAP_CONTENT;
param.width = LinearLayout.LayoutParams.MATCH_PARENT;
}
itemView.setLayoutParams(param);
}
}
4、实体类Bean:
private boolean isSelect; //这个用于标记一些item被选中(给的代码暂时没用到,后面扩展用的)
private String name;//item显示内容
private String title;//标记用的,随意起了个名字(大家自己定义)
5、activity
//主要代码 这个是数据源
private void initRecycle() {
mDatas.add(new GroundBean("coco1",""));
mDatas.add(new GroundBean("item1","coco1"));
mDatas.add(new GroundBean("item2","coco1"));
mDatas.add(new GroundBean("item3","coco1"));
mDatas.add(new GroundBean("item4","coco1"));
mDatas.add(new GroundBean("item5","coco1"));
mDatas.add(new GroundBean("item6","coco1"));
mDatas.add(new GroundBean("item7","coco1"));
mDatas.add(new GroundBean("coco2",""));
mDatas.add(new GroundBean("item1","coco2"));
mDatas.add(new GroundBean("item2","coco2"));
mDatas.add(new GroundBean("item3","coco2"));
mDatas.add(new GroundBean("item4","coco2"));
mDatas.add(new GroundBean("item5","coco2"));
mDatas.add(new GroundBean("item6","coco2"));
mDatas.add(new GroundBean("item7","coco2"));
mDatas.add(new GroundBean("coco3",""));
mDatas.add(new GroundBean("item1","coco3"));
mDatas.add(new GroundBean("item2","coco3"));
mDatas.add(new GroundBean("item3","coco3"));
mDatas.add(new GroundBean("item4","coco3"));
mDatas.add(new GroundBean("item5","coco3"));
mDatas.add(new GroundBean("item6","coco3"));
mDatas.add(new GroundBean("item7","coco3"));
adapter = new GroundAdapter(mContext, mDatas);
mRvGround.addItemDecoration(new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL));
mRvGround.setLayoutManager(new GridLayoutManager(mContext,3));
mRvGround.setAdapter(adapter);
}
这个功能代码很简单的,我就不上源码了,有需要的可以给我消息
联系方式:
QQ:915832847
邮箱:wx_bin@sina.com