無限級樹

廢話不多說,直接上代碼:

首先,後端返回樹形結構的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      羣主會解釋的。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章