package org.openhab.habclient.rule; import android.content.Context; import android.util.Log; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import org.openhab.domain.rule.RuleTreeItem; /** * Created by Tony Alpskog in 2014. */ public class ExpandableMultiLevelGroupAdapter extends BaseExpandableListAdapter { int mLevelNumber; Context mContext; SparseArray<RuleTreeItem> mTreeData; public ExpandableMultiLevelGroupAdapter(Context context, SparseArray<RuleTreeItem> treeData) { this(context, treeData, 1); } private ExpandableMultiLevelGroupAdapter(Context context, SparseArray<RuleTreeItem> treeData, int levelNumber) { mContext = context; mTreeData = treeData; mLevelNumber = levelNumber; } @Override public Object getChild(int groupPosition, int childPosititon) { return ((RuleTreeItem) getGroup(groupPosition)).mChildren.get(Integer.valueOf(childPosititon)); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final RuleTreeItem childItem = (RuleTreeItem) getChild(groupPosition, childPosition); Log.d("Tree", "Tree.Child = " + childItem.mName); if(childItem.mChildren.size() < 1) { TextView tv = new TextView(mContext); tv.setText(childItem.mName); tv.setPadding(50, 7, 7, 7); //tv.setBackgroundColor(Color.YELLOW); ViewGroup.LayoutParams params = tv.getLayoutParams(); // params.width = FrameLayout.LayoutParams.MATCH_PARENT; // params.height = FrameLayout.LayoutParams.FILL_PARENT; tv.setLayoutParams(new ListView.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); return tv; } MultiGroupExpandableListView branchView = new MultiGroupExpandableListView(mContext); ViewGroup.LayoutParams params = branchView.getLayoutParams(); if(params == null) params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); // params.width = ViewGroup.LayoutParams.FILL_PARENT; // params.height = ViewGroup.LayoutParams.MATCH_PARENT; branchView.setLayoutParams(params); branchView.setPadding(50, 0, 0, 0); SparseArray<RuleTreeItem> childAsHash = new SparseArray<RuleTreeItem>(); childAsHash.put(0, childItem); branchView.setAdapter(new ExpandableMultiLevelGroupAdapter(mContext, childAsHash, mLevelNumber + 1)); //branchView.setGroupIndicator(null); // Group expanded listener branchView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { // mSelectedItem = getTreeData().get(Integer.valueOf(groupPosition)); Toast.makeText(mContext, getTreeData().get(Integer.valueOf(groupPosition)).getItemId() + " Expanded_2", Toast.LENGTH_SHORT).show(); } }); // Group collasped listener branchView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { @Override public void onGroupCollapse(int groupPosition) { Toast.makeText(mContext, getTreeData().get(Integer.valueOf(groupPosition)).getItemId() + " Collapsed:2", Toast.LENGTH_SHORT).show(); } }); return branchView; } private boolean hasGrandChildren(RuleTreeItem treeItem) { if(treeItem.mChildren.size() < 1) return false; for (RuleTreeItem ruleTreeItem : treeItem.mChildren.values()) { if (!ruleTreeItem.mChildren.isEmpty()) return true; } return false; } @Override public int getChildrenCount(int groupPosition) { return ((RuleTreeItem) getGroup(groupPosition)).mChildren.size(); } @Override public Object getGroup(int groupPosition) { return getTreeData().get(Integer.valueOf(groupPosition)); } @Override public int getGroupCount() { return getTreeData().size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { Log.d("Tree", "Tree.Group = " + ((RuleTreeItem) getGroup(groupPosition)).mName); TextView tv = new TextView(mContext); tv.setText(((RuleTreeItem) getGroup(groupPosition)).mName); //tv.setBackgroundColor(Color.BLUE); tv.setPadding(50, 7, 7, 7); return tv; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private SparseArray<RuleTreeItem> getTreeData() { if(mTreeData == null) mTreeData = new SparseArray<RuleTreeItem>(); return mTreeData; } //==================================================== //============== Internal classes ==================== //==================================================== private class MultiGroupExpandableListView extends ExpandableListView { int intGroupPosition, intChildPosition, intGroupid; public MultiGroupExpandableListView(Context context) { super(context); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST); heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }