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
原创粉丝点击