在可扩展列表视图中重复子节点



我正在开发android的三层可扩展列表视图。但是子节点的填充顺序是重复的。这是我的源代码:

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;
        } 
}

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

Android

iOS

HTC

我也遇到过同样的问题,在网上找不到解决方案。

在做了一些日志记录后,我得出的结论是,父级BaseExpandbleAdapater将调用/创建一个对应于数据集/组中儿童数量的childView。不幸的是,这在三层嵌套列表场景中是不可取的。

因此,当生成三级列表时,只需在父适配器中像这样创建getChildrenCount函数:

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

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

这是令人困惑的,因为你的子/嵌套适配器处理显示实际的"子",而在单个嵌套列表中,你的子处理在同一个父适配器类中。在此场景中,子/嵌套适配器将处理显示子组件作为其自己的groupView,使父组件适配器中的子组件数量无关紧要。至少这是我的结果和环境告诉我的……

希望我能帮上忙,这让我难住了半天。

最新更新