多级列表网上有很多文章,具体怎么实现的就不说了就拿这篇举个例子
这篇文章实现了点击展开,点击缩放的功能,但是不是很符合一般的收缩列表,一般情况下,我们点击的时候,会自动收缩其他的,只展开,自己点击的那一项。那么问题怎么解决呢,办法就是记录上一次点击的那个位置,然后再点击展开的时候关闭上一次打开的。然而有个问题就是,点击展开列表的下面的时候位置和下次需要关闭位置是不一样的,多了一个子项目的长度,所以说点击的时候需要判断点击的位置是在展开的子项之前还是之后,之前就不需要处理,之后需要去掉。那么具体实现代码如下:
public class ExpandableItemReleaseAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> {
public static final int ITEM_FIRST_LEVEL = 1;
public static final int ITEM_SECOND_LEVEL = 2;
//记录最后的点击位置
public int lastPosition = 0;
//记录展开的子项的个数
public int childPosition = 0;
public ExpandableItemReleaseAdapter(@Nullable List<MultiItemEntity> data) {
super(data);
addItemType(ITEM_FIRST_LEVEL, R.layout.item_realease_game_1v0);
addItemType(ITEM_SECOND_LEVEL, R.layout.item_realease_game_1v1);
}
@Override
protected void convert(final BaseViewHolder helper, MultiItemEntity item) {
switch (helper.getItemViewType()) {
case ITEM_FIRST_LEVEL:
final GamePublishBean.PublishBean item_temp = (GamePublishBean.PublishBean) item;
helper.setText(R.id.tv_type, item_temp.getPublishSubject());
helper.setText(R.id.tv_state, item_temp.getIsCanTest().equals("0") ? "不可训练" : "可训练");
int pos = helper.getAdapterPosition();
if (item_temp.isExpanded()) {
collapse(pos);
} else {
collapse(lastPosition);
//点击的一级列表是在已经展开的子项后面,此时需要重新计算位置
if (pos > lastPosition) {
expand(pos - childPosition + lastPosition);
lastPosition = pos - childPosition + lastPosition;
}else {
expand(pos);
lastPosition = pos;
}
}
break;
case ITEM_SECOND_LEVEL:
final PublishInfoBean.InfoBean item_temp2 = (PublishInfoBean.InfoBean) item;
helper.setText(R.id.tv_second, item_temp2.getGameName());
helper.addOnClickListener(R.id.tv_second);
childPosition = helper.getAdapterPosition();
break;
}
}
}
网友评论