在Expandable listView中重复子项

时间:2013-03-08 03:29:48

标签: android expandablelistview expandablelistadapter

我正在开发android中的三级可扩展listview。但我的子节点按重复顺序填充。这是我的源代码:

public class CarPanel extends ExpandableListActivity {

    static ArrayList<String> groupItem = new ArrayList<String>();
    static ArrayList<String> childItem = new ArrayList<String>();
    static ArrayList<Object> grandChildItem = new ArrayList<Object>();
    static public ArrayList<String> childValue;
    static public ArrayList<String> grandChildValue;

    EditText modelType, price, dyp, insurance;

    static int dummyFlag = 0;
    public LayoutInflater minflater;
    public Activity activity;

    private MyDBManager dbManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
        //Remove title bar
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        //Remove notification bar    
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        dbManager = new MyDBManager(this);
        dbManager.open();

        ExpandableListView expandbleLis = getExpandableListView();
        expandbleLis.setDividerHeight(2);
        expandbleLis.setGroupIndicator(null);
        expandbleLis.setClickable(true);

        // 1st level data       
        setGroupData();

        // 2nd level data
        setChildGroupData();

        // 3rd level data
        setGrandChildGroupData();

        ParentLevel parentAdapter = new ParentLevel(groupItem);
        parentAdapter.setInflater((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);
        getExpandableListView().setAdapter(parentAdapter);
        expandbleLis.setOnChildClickListener(this);

    }

    public class ParentLevel extends BaseExpandableListAdapter {


        public ParentLevel(ArrayList<String> groupList) {
             groupItem = groupList;
        }

        public Object getChild(int arg0, int arg1) {
            return arg1;
        }

        public void setInflater(LayoutInflater mInflater, Activity act) {
            minflater = mInflater;
            activity = act;
        }


        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }


        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            CustExpListview SecondLevelexplv = new CustExpListview(CarPanel.this);
            SecondLevelexplv.setAdapter(new SecondLevelAdapter(childItem, grandChildItem ));
            SecondLevelexplv.setGroupIndicator(null);

            return SecondLevelexplv;
        }


        public int getChildrenCount(int groupPosition) {
            Log.v("childItem.size()", "childItem.size()  " +childItem.size());
            return childItem.size();
        }


        public Object getGroup(int groupPosition) {
            return groupPosition;
        }


        public int getGroupCount() {
            Log.v("groupItem.size()", "groupItem.size()  " +groupItem.size());
            return groupItem.size();
        }


        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = minflater.inflate(R.layout.grouprow, null);
            }
            ((CheckedTextView) convertView).setText(groupItem.get(groupPosition));
            ((CheckedTextView) convertView).setChecked(isExpanded);
            return convertView;
        }


        public boolean hasStableIds() {
            return true;
        }


        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }

    class CustExpListview extends ExpandableListView {

        int intGroupPosition, intChildPosition, intGroupid;

        public CustExpListview(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);
        }
    }

    class SecondLevelAdapter extends BaseExpandableListAdapter {

        public LayoutInflater minflater;
        public Context activity;

    public SecondLevelAdapter(ArrayList<String> childList, ArrayList<Object> grandChildList) {
            childItem = childList;
            grandChildItem = grandChildList;
        }

        public void setInflater(LayoutInflater mInflater, Context parentLevel) {
            minflater = mInflater;
            activity = parentLevel;
        }

        public Object getChild(int groupPosition, int childPosition) {
            return childPosition;
        }


        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }


        @SuppressWarnings("unchecked")
        public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            grandChildValue = (ArrayList<String>) grandChildItem.get(groupPosition);
            EditText modelType, price, dyp, insurance;
            if (convertView == null) {
                 LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.grandchildrow, null);
            }

            modelType = (EditText) convertView.findViewById(R.id.et_ModelType);
            price = (EditText) convertView.findViewById(R.id.et_Price);
            dyp = (EditText) convertView.findViewById(R.id.et_DYP);
            insurance = (EditText) convertView.findViewById(R.id.et_Insurance);

            modelType.setText(grandChildValue.get(childPosition));

            convertView.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Toast.makeText(getBaseContext(), grandChildValue.get(childPosition), Toast.LENGTH_SHORT).show();
                }
            });


            return convertView;
        }


        public int getChildrenCount(int groupPosition) {
            return ((ArrayList<String>) grandChildItem.get(groupPosition)).size();
        }


        public Object getGroup(int groupPosition) {
            return groupPosition;
        }

        public int getGroupCount() {
            return childItem.size();
        }


        public long getGroupId(int groupPosition) {
            return groupPosition;
        }


        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.childrow, null);
            }
            ((CheckedTextView) convertView).setText(childItem.get(groupPosition));
            ((CheckedTextView) convertView).setChecked(isExpanded);
            return convertView;

        }


        public boolean hasStableIds() {
            return true;
        }


        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }

    }

    public void setGroupData() {
        groupItem.clear();

        Cursor cursor = dbManager.execQuery("SELECT DISTINCT carName FROM model");
        final List<ModelBean> modelList = new ArrayList<ModelBean>();
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            ModelBean beanObj = cursorToModel(cursor);
            modelList.add(beanObj);
            cursor.moveToNext();
        }
        // Make sure to close the cursor
        cursor.close();
        ModelBean modelObj = null;

        if (modelList.size() > 0 )
        {
            for (int i = 0; i < modelList.size(); i++)
            {
                modelObj = modelList.get(i);
                String carName = modelObj.getCarName();             
                groupItem.add(carName);
            }
        }
    }     

    public void setChildGroupData() {

        childItem.clear();

        childItem.add("Android");

        childItem.add("iOS");

        childItem.add("HTC");

    }

    public void setGrandChildGroupData() {
        grandChildItem.clear();

        ArrayList<String> child = new ArrayList<String>();
        child.add("PASSAT 1");
        child.add("PASSAT 2");
        grandChildItem.add(child);

        child = new ArrayList<String>();
        child.add("POLO 1");
        child.add("POLO 2");
        grandChildItem.add(child);

        child = new ArrayList<String>();
        child.add("VITZ 1");
        child.add("VITZ 2");
        grandChildItem.add(child);

    }

    private ModelBean cursorToModel(Cursor cursor) 
       {
          ModelBean modelBean = new ModelBean();
          modelBean.setCarName(cursor.getString(0));

         return modelBean;
        } 
}

现在我希望这个块代码只为每个父组重复一次,但重复三次。我搜索了更多类似的SO问题,但没有解决。

的Android

的iOS

HTC

1 个答案:

答案 0 :(得分:8)

我在同样的问题上挣扎,无法在网上找到解决方案/ SO。

在做了一些日志记录后,我得出结论,父级BaseExpandbleAdapater将调用/创建一个与数据集/组中子项数相对应的childView。不幸的是,在三级嵌套列表方案中不需要这样做。

因此,在生成三级列表时,只需在父适配器中创建函数getChildrenCount,如下所示:

    @Override
    public int getChildrenCount(int groupPosition){
         return 1;
    }

现在它只会构建子列表项的“1”迭代,即使1个嵌套列表可以包含任意数量的子项,从子适配器的角度来看它们也会成为组。

令人困惑,因为您的子/嵌套适配器处理显示实际的“子”,而在单个嵌套列表中,您的子项在同一父适配器类中处理。在这种情况下,子/嵌套适配器将处理将子项显示为其自己的groupView,从而使父适配器中的子项数不相关。至少这是我的结果和环境向我展示的......

希望我能得到帮助,这让我感到困难了半天。