树形结果的多级列表,其实就是不同级别数据的缩进位移不同;
两个关键点,一是在adapter中根据级别设定缩进的数值;
二是对数据的处理;
首先定义一个数据bean:
在bean中 定义数据的级别level显示时缩进的设定就是依据这个level
例如第二级有多个数据 每个数据都有自己的下一级也就是第三级 这个时候为了区分第三级也就是子集归属哪个父级用分组的方式:父级有组id 子集有所在组的id 如果子集所在组的id与父级的组id相同那这个子级就是这个父级的;
isOpen:有子级的父级会在展示时在最左侧添加一个加号的可点击图标用以区分展示子级(变为减号)收起子级(变回加号)
public class GustInformationBean {
private String id;
private boolean isGroup;//是否是组(此账号下是否包含子账号)
private int gId;//组id
private int belongToID;//所在组的id
private int level;//自身的级别
private boolean isOpen;//
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean isGroup() {
return isGroup;
}
public void setGroup(boolean group) {
isGroup = group;
}
public int getgId() {
return gId;
}
public void setgId(int gId) {
this.gId = gId;
}
public int getBelongToID() {
return belongToID;
}
public void setBelongToID(int belongToID) {
this.belongToID = belongToID;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public boolean isOpen() {
return isOpen;
}
public void setOpen(boolean open) {
isOpen = open;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Ac'ti'vi't'y中操作,绑定recyclerview 生成模拟数据源 数据操作方法
public class F_FilterUser extends BaseFragment {
private RecyclerView recyclerView;
private List<GustInformationBean> dataList;
private List<GustInformationBean> dataListForShowData;
private F_FilterUserAdapter adapter;
@Override
public View onCreateView() {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_filter_user, null);
init(view);
return view;
}
private void init(View view) {
recyclerView = view.findViewById(R.id.filterUserList);
dataList = new ArrayList<>();
dataListForShowData = new ArrayList<>();
adapter = new F_FilterUserAdapter(getActivity(), dataListForShowData);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL);
dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.item_divide));
recyclerView.addItemDecoration(dividerItemDecoration);
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(position -> {
});
adapter.setOnDownArrowClickListener(position -> setData(position));
obtainData();
}
private void obtainData() {//模拟展示数据
for (int i = 0; i < 10; i++) {
GustInformationBean gustInformationBean = new GustInformationBean();
if (i < 4) {
gustInformationBean.setLevel(1);
gustInformationBean.setGroup(true);
gustInformationBean.setgId(i);
gustInformationBean.setBelongToID(-1);
gustInformationBean.setName("xxxx" + (i));
} else if (i == 4 || i == 5 || i == 6 || i == 7) {
gustInformationBean.setLevel(2);
gustInformationBean.setGroup(true);
gustInformationBean.setBelongToID(i - 4);
gustInformationBean.setgId(i);
gustInformationBean.setName("xxxx 2级" + (i));
} else {
gustInformationBean.setLevel(3);
gustInformationBean.setGroup(false);
gustInformationBean.setBelongToID(4);
gustInformationBean.setName("xxxx 3级" + (i));
}
dataList.add(gustInformationBean);
}
for (int i = 0; i < dataList.size(); i++) {
GustInformationBean gustInformationBean = dataList.get(i);
if (gustInformationBean.getLevel() == 1) {
dataListForShowData.add(gustInformationBean);
}
}
adapter.notifyDataSetChanged();
}
/**
* 根据子级执行的展开还是关闭的操作来重组数据,然后刷新列表达到展示子级或关闭子级的显示效果
* @param position
*/
private void setData(int position) {
GustInformationBean gustInformationBean = dataListForShowData.get(position);
boolean isOpen = gustInformationBean.isOpen();
gustInformationBean.isGroup();
gustInformationBean.getgId();
if (isOpen) {//当前为打开状态所以此次点击执行关闭子级的操作
dataListForShowData.get(position).setOpen(false);//因为是关闭操作将open属性设定为关闭
List<GustInformationBean> dataListNew = new ArrayList<>();
int level = dataListForShowData.get(position).getLevel();
//在当前展示数据中删除符合范围的子级
for (int i = position + 1; i < dataListForShowData.size(); i++) {
GustInformationBean gustInformationBean1 = dataListForShowData.get(i);
int childLevel = gustInformationBean1.getLevel();
if (childLevel > level) {//因为当前展示的数据是有序的所以只要删除在当前所选项与相邻下一个与所选项级别相同的项之间的数据就可以了
gustInformationBean1.setOpen(false);
dataListNew.add(gustInformationBean1);
} else {
break;
}
}
dataListForShowData.removeAll(dataListNew);
adapter.notifyDataSetChanged();
} else {//当前为关闭状态执行打开操作
dataListForShowData.get(position).setOpen(true);
List<GustInformationBean> dataListNew = new ArrayList<>();
dataListNew.addAll(dataListForShowData);
int gId = dataListForShowData.get(position).getgId();
//在总的数据源中筛选
for (int i = 0; i < dataList.size(); i++) {
GustInformationBean gustInformationBean1 = dataList.get(i);
int btId = gustInformationBean1.getBelongToID();
if (btId == gId) {//找出所归属的组id与所选项组id相同的项
dataListNew.add(position + 1, gustInformationBean1);
}
}
dataListForShowData.clear();
dataListForShowData.addAll(dataListNew);
adapter.notifyDataSetChanged();
}
}
}
adapter 操作 根据level设定数据左缩进的程度public class F_FilterUserAdapter extends Adapter {
private List<GustInformationBean> listData;
private Context context;
public F_FilterUserAdapter(Context context, List<GustInformationBean> listData) {
this.context = context;
this.listData = listData;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_filter_user_adapter, null);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
GustInformationBean gustInformationBean = listData.get(i);
if (gustInformationBean != null) {
boolean isG = gustInformationBean.isGroup();
if (isG) {//判断是否时组即有没有子级
myViewHolder.itemFilterUserGroupIcon.setVisibility(View.VISIBLE);//显示表示有子级的图标
boolean isOpen = gustInformationBean.isOpen();
if (isOpen) {//判断当前是加号图标还是减号图标
myViewHolder.itemFilterUserGroupIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_arrow_drop_up_black_24dp));
} else {
myViewHolder.itemFilterUserGroupIcon.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_arrow_drop_down_black_24dp));
}
//为图标添加点击监听用以展开和关闭子级
myViewHolder.itemFilterUserGroupIcon.setOnClickListener(v -> {
if (onDownArrowClickListener != null) {
onDownArrowClickListener.onDownArrowClick(i);
}
});
} else {
myViewHolder.itemFilterUserGroupIcon.setVisibility(View.INVISIBLE);
}
//根据级别设定数据的左侧缩进
int level = gustInformationBean.getLevel();
myViewHolder.itemFilterUserGroupIcon.setPadding(25 * level, myViewHolder.itemFilterUserGroupIcon.getPaddingTop()
, myViewHolder.itemFilterUserGroupIcon.getPaddingRight()
, myViewHolder.itemFilterUserGroupIcon.getPaddingBottom());
String nameStr = gustInformationBean.getName();
if (nameStr != null) {
myViewHolder.itemFilterUserName.setText(nameStr);
}
}
myViewHolder.itemView.setOnClickListener(v -> {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(i);
}
});
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
return listData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView itemFilterUserName;
private ImageView itemFilterUserGroupIcon;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
itemFilterUserName = itemView.findViewById(R.id.itemFilterUserName);
itemFilterUserGroupIcon = itemView.findViewById(R.id.itemFilterUserGroupIcon);
}
}
//定义的item的点击监听
public interface OnItemClickListener {
void onItemClick(int position);
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
//定义的执行展开和关闭操作的按钮的点击监听
public interface OnDownArrowClickListener {
void onDownArrowClick(int position);
}
private OnDownArrowClickListener onDownArrowClickListener;
public void setOnDownArrowClickListener(OnDownArrowClickListener onDownArrowClickListener) {
this.onDownArrowClickListener = onDownArrowClickListener;
}
}
layout都很简单,activity就一个recycler view ; adapter中横向排布一个image view和一个text view;