廢話不多說,直接上代碼:
首先,後端返回樹形結構的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 羣主會解釋的。