首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可扩展listView安卓系统中的重复子进程

可扩展listView安卓系统中的重复子进程
EN

Stack Overflow用户
提问于 2013-03-08 11:29:48
回答 1查看 3.1K关注 0票数 3

我正在开发三级可扩展列表视图在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;
        } 
}

现在,我希望这个块的代码对每个父组只重复一次,但是它会重复三次。我已经搜索了更多和相似的SO问题,但没有得到解决。

安卓

iOS

HTC

EN

回答 1

Stack Overflow用户

发布于 2013-09-18 22:48:38

我在这个问题上苦苦挣扎,在任何地方都找不到解决方案。

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

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

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

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

这很令人困惑,因为您的子/嵌套适配器处理实际“子”的显示,而在单个嵌套列表中,您的子适配器在同一父适配器类中处理。在这个场景中,子适配器/嵌套适配器将把子适配器显示为它自己的groupView,这使得父适配器中的子适配器的数量变得无关紧要。至少这是我的结果和环境向我展示的……

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15286219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档