废话不多说,直接上代码:
首先,后端返回树形结构的json字符串之后,作为Android要把这串json变成树形结构的页面,这时候,一般都是listview+adapter
那么,适配器的代码如下:
import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.utils.Util; import com.xmkeyun.accountcomputer.R; import com.xmkeyun.accountcomputer.model.TreeBean; /** * 树形结构 * * @author ChenQJ * @since 2017-7-27 * */ public class AdapterTree extends BaseAdapter { private List<TreeBean> mDatas; private Context mContext; private OnClickTreeAdapter adapterClick; public AdapterTree(Context context, List<TreeBean> datas, OnClickTreeAdapter adapterClick) { this.mContext = context; this.mDatas = datas; this.adapterClick = adapterClick; } public void setList(List<TreeBean> mList) { this.mDatas = mList; notifyDataSetChanged(); } public void clear() { this.mDatas.clear(); notifyDataSetChanged(); } @Override public int getCount() { return mDatas == null ? 0 : mDatas.size(); } @Override public TreeBean getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View view, ViewGroup parent) { final MyViewHolder holder; if (view == null) { view = LayoutInflater.from(mContext).inflate(R.layout.item_subject_info, parent, false); holder = new MyViewHolder(view); view.setTag(holder); } else { holder = (MyViewHolder) view.getTag(); } final TreeBean bean = mDatas.get(position); holder.itemView.setPadding((Integer.parseInt(bean.getAttributes().getJici()) - 1) * Util.dp2px(mContext, 20), 0, 0, 0); holder.label.setText(bean.getText()); if (bean.getChildren() != null && bean.getChildren().size() > 0) { holder.icon.setVisibility(View.VISIBLE); } else { holder.icon.setVisibility(View.INVISIBLE); } if (bean.isExpanded()) {// 展开 holder.icon.setImageResource(R.drawable.ic_arrow_down); } else {// 不展开 holder.icon.setImageResource(R.drawable.ic_arrow_right); } // 添加点击事件 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (bean.getChildren() != null && bean.getChildren().size() > 0) {// 存在子节点 if (!bean.isExpanded()) {// 展开 // 加数据 addChildList(position, bean); } else {// 收起 // 删数据 deleteChildList(bean, bean.getChildren()); } // 防止在最后一层设置是否展开,因为最后一级没有,不需要设置 bean.setExpanded(!bean.isExpanded()); } else { adapterClick.onClickAdapter(bean); } notifyDataSetChanged(); } }); return view; } // 递归 删除childList private void deleteChildList(TreeBean bean, List<TreeBean> childList) { for (TreeBean childBaen : childList) { if (childBaen.isExpanded()) {// 展开 deleteChildList(childBaen, childBaen.getChildren()); childBaen.setExpanded(!childBaen.isExpanded());// 设置不展开 } mDatas.remove(childBaen); } } // 添加childList private void addChildList(int position, TreeBean bean) { List<TreeBean> childList = bean.getChildren(); for (int i = childList.size() - 1; i >= 0; i--) { mDatas.add(position + 1, childList.get(i)); } } public class MyViewHolder { private LinearLayout itemView; private ImageView icon; private TextView label; public MyViewHolder(View view) { itemView = (LinearLayout) view.findViewById(R.id.itemView); label = (TextView) view.findViewById(R.id.id_treenode_name); icon = (ImageView) view.findViewById(R.id.id_treenode_icon); } } // 节点点击回调 public interface OnClickTreeAdapter { void onClickAdapter(TreeBean node); } }然后,这个时候,还需要布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/itemView" android:layout_width="match_parent" android:layout_height="30dp" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/id_treenode_icon" style="@style/image_style" android:layout_marginLeft="10dp" /> <TextView android:id="@+id/id_treenode_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ellipsize="end" android:paddingLeft="5dp" android:paddingRight="10dp" android:singleLine="true" android:textColor="@color/gray_blue_select" android:textSize="14sp" /> </LinearLayout>
那么,看到这,或许也知道怎么做了,当然做为一个好人,我需要在添加个activity的代码片段
adapter = new AdapterTree(mContext, new ArrayList<TreeBean>(), new OnClickTreeAdapter() { @Override public void onClickAdapter(TreeBean node) { // 点击最后一级,选择回调 mClickTree.onClick(node); dismiss(); } }); listview.setAdapter(adapter);我们要的就是最简单的,性能最好的。
若有不懂的话,请加QQ群:129228867 群主会解释的。