Android多级树形结构列表(理论上可以无限级)
来源:互联网 发布:狸窝转换器mac版 编辑:程序博客网 时间:2024/05/20 11:49
转载请注明出处 http://blog.csdn.net/stevenduan17
最近有需求做多级树形结构的列表,使用ExpandableListView不能实现,无奈,只能自己写了,主要时层级之间使用padding来体现层级关系,先看效果
话不多说,直接上代码
主界面及列表实现
public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getName(); @BindView(R.id.mRecyclerView) RecyclerView mRecyclerView; private MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); getSupportActionBar().setTitle("多级树列表"); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); myAdapter = new MyAdapter(); mRecyclerView.setAdapter(myAdapter); //先初始化两条数据 addData(1, 0); } class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<Node> list = new ArrayList<>(); public void addItem(int position, Node node) { list.add(position, node); notifyItemInserted(position); Log.d(TAG, "addItem: " + position); } public class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.mImageView) ImageView mImageView; @BindView(R.id.mTextView) TextView mTextView; public ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(itemView); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { Node node = list.get(position); //最后一级时把展开收起三角图片隐藏 holder.mImageView.setVisibility(node.getLevel() == 4 ? View.GONE : View.VISIBLE); //展开或收起图标 holder.mImageView.setImageResource(node.isExpand() ? R.drawable.ic_expand_more : R.drawable.ic_expand_less); holder.mTextView.setText(node.getName()); //缩进控制 界面层级关系 holder.itemView.setPadding(node.getLevel() * dpToPx(16f), dpToPx(9f), dpToPx(16f), dpToPx(9f)); //点击条目展开或收起下一级 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //最好不要把node final int p = holder.getAdapterPosition(); Node n = list.get(p); //如果时最后一级 点击无效 if (n.getLevel() == 4) { return; } //收起或展开下一级 if (n.isExpand()) { //收起 holder.mImageView.setImageResource(R.drawable.ic_expand_less); //删除下一级 removeLevelLower(p, n.getLevel()); //更新伸展状态 setItemExpand(p, false); } else { //展开 加载下一级 holder.mImageView.setImageResource(R.drawable.ic_expand_more); //添加下一级数据 这里只是假数据 addData(n.getLevel() + 1, p + 1); setItemExpand(p, true); } } }); } @Override public int getItemCount() { return list == null ? 0 : list.size(); } /** * 移除当前节点下所有子节点 * * @param position * @param level */ private void removeLevelLower(int position, int level) { int size = list.size(); int i = 0; List<Node> nodeList = new ArrayList<>(); while (position + (++i) < size && list.get(position + i).getLevel() > level) { nodeList.add(list.get(position + i)); } Log.d(TAG, "需要移除下级节点数量:" + nodeList.size()); if (!nodeList.isEmpty()) { list.removeAll(nodeList); notifyItemRangeRemoved(position + 1, position + i); mRecyclerView.scrollToPosition(position); } } /** * 更新条目伸缩状态 * * @param position * @param expand */ public void setItemExpand(int position, boolean expand) { Node item = list.get(position); item.setExpand(expand); list.set(position, item); } } /** * 添加数据 * * @param level */ private void addData(int level, int position) { //测试数据 一般是异步请求得到的数据 for (int i = 0; i < 3; i++) { myAdapter.addItem(position++, new Node(UUID.randomUUID().toString(), level, false)); } Log.d(TAG, "添加数据"); } /** * dp转px * * @param dp * @return */ private int dpToPx(float dp) { float density = getResources().getDisplayMetrics().density; return (int) (dp * density + 0.5f); }}
activity_main.xml 只是一个RecyclerView
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/mRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/></android.support.design.widget.CoordinatorLayout>
item_layout.xml
<?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:background="@drawable/bg_white_with_bottom_border" android:orientation="horizontal"> <ImageView android:id="@+id/mImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_expand_less"/> <TextView android:id="@+id/mTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/app_name"/></LinearLayout>
1 0
- Android多级树形结构列表(理论上可以无限级)
- android多级树形列表
- 利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法
- 利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)
- 无限级分类,树形结构
- 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)
- 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)
- 多叉树结合JavaScript树形控件实现无限级树形菜单(一种构建多级有序树形结构JSON(或XML)数据源的方法)
- 三级菜单拖拽排序,各级互不影响,理论上可以无限级菜单
- 更快实现Android多级树形选择列表
- DropDownList中显示无限级树形结构
- DropDownList中显示无限级树形结构
- 关于无限级理解,及其树形结构
- 分销算法 无限级树形结构算法
- 学习(四)自定义多级树形列表
- Android ExpandableListView(多级列表)
- Android-多级列表-popupWindow
- android多级列表
- wcf服务寄宿时,如何指定终结点三要素才不会出错
- 超实用PHP函数总结整理
- 从装饰设计模式角度学习JavaIO字节流
- 第6章 使用Linux环境变量
- android fragment与activity交互demo
- Android多级树形结构列表(理论上可以无限级)
- 交互设计师,你原来是这样的“线框仔”
- MVP继续封装
- JAVA设计模式之门面模式(外观模式)
- Java学习篇之JDBCUtils工具类
- Modbus协议学习
- 让canvas的高度自适应
- XML::Parser module installlibxml-simple-perl
- [Mapbox GL]添加实时数据