【问题标题】:Android displaying list using expandableListViewAndroid使用expandableListView显示列表
【发布时间】:2014-04-07 01:58:57
【问题描述】:

我已经按照这个示例教程开发了一个示例应用程序http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/

如果我点击 Core 我想在 Core 下的同一屏幕上加载一个列表,我该怎么做?使用下面的代码我可以在另一个屏幕中加载子列表,帮助?

我的 ChildClickListener 代码放在这里:

        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                int groupPosition, int childPosition, long id) {
            // TODO Auto-generated method stub

            Log.d("onChildClick", "onChildClick");

            String position = (String) parentItems.get(groupPosition);
            Log.d("position", position);

            String child = listDataChild.get(position).get(childPosition);

            Log.d("child", child);

            if (child.equalsIgnoreCase("Core")) {

                ArrayList<String> parentItems = new ArrayList<String>();

                HashMap<String, List<String>> listDataChild = new HashMap<String, List<String>>();
                ArrayList<String> childItems = new ArrayList<String>();
                childItems.add("corejava");
                childItems.add("corejava");
                childItems.add("corejava");
                childItems.add("corejava");

                parentItems.add(position);
                listDataChild.put(parentItems.get(0), childItems);
                expandableList = (ExpandableListView) findViewById(R.id.lvExp);

                CoreAdapter adapter = new CoreAdapter(parentItems,
                        listDataChild);
                CustExpListview SecondLevelexplv = new CustExpListview(
                        MainActivity.this);
                adapter.setInflater(
                        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE),
                        MainActivity.this);

                SecondLevelexplv.setAdapter(adapter);
                SecondLevelexplv.setGroupIndicator(null);

                expandableList.setAdapter(adapter);

            }

【问题讨论】:

    标签: android android-intent android-listview expandablelistview


    【解决方案1】:

    我为你编写了一个treeView适配器,你可以使用它并根据需要放置多个级别,因为你只需复制以下代码:

    主活动:

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // add data for test on one list<AccountHierarchical>
    
    
            AccountHierarchical obj = new AccountHierarchical();
            obj.setLevelId(1);
            obj.setTitle("level 1");
    
    
            AccountHierarchical obj2 = new AccountHierarchical();
            obj2.setLevelId(1);
            obj2.setTitle("level 2");
    
    
            AccountHierarchical obj3 = new AccountHierarchical();
            obj3.setLevelId(1);
            obj3.setTitle("level 3");
    
    
            List<AccountHierarchical> emptyList = new ArrayList<AccountHierarchical>();
            obj3.setList(emptyList);
    
            List<AccountHierarchical> list2 = new ArrayList<AccountHierarchical>();
            list2.add(obj3);list2.add(obj3);list2.add(obj3);list2.add(obj3);list2.add(obj3);
            obj2.setList(list2);
    
            List<AccountHierarchical> list = new ArrayList<AccountHierarchical>();
            list.add(obj2);list.add(obj2);list.add(obj2);list.add(obj2);list.add(obj2);
            obj.setList(list);
    
    
            List<AccountHierarchical> result = new ArrayList<AccountHierarchical>();
            result.add(obj);result.add(obj);result.add(obj);result.add(obj);
    
    
    
            // create Adapter
            TreeView adapter = new TreeView(result, this,
                    getLayoutInflater() , false, 0);
    
            ExpandableListView expandList = (ExpandableListView)findViewById(R.id.expandableList_tree);
            expandList.setGroupIndicator(null);
            expandList.setAdapter(adapter);
        }
    

    CustExpList 视图:

    public class CustExpListview extends ExpandableListView {
    
        int intGroupPosition, intChildPosition, intGroupid;
    
        public CustExpListview(Context context) {
               super(context);
        }
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //           widthMeasureSpec = MeasureSpec.makeMeasureSpec(400,
    //                        MeasureSpec.AT_MOST);
               heightMeasureSpec = MeasureSpec.makeMeasureSpec(600,
                            MeasureSpec.AT_MOST);
               super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
    
    }
    

    AccountHierarchical:

    public class AccountHierarchical {
    
        List<AccountHierarchical> list;
        private String Title;
        private int Id;
    
    
        public int getId() {
            return Id;
        }
    
        public void setLevelId(int Id) {
            this.Id = Id;
        }
    
        public String getTitle() {
            return Title;
        }
    
        public void setTitle(String title) {
            Title = title;
        }
    
        public List<AccountHierarchical> getList() {
            return list;
        }
    
        public void setList(List<AccountHierarchical> list) {
            this.list = list;
        }
    
    }
    

    树视图:

    public class TreeView extends BaseExpandableListAdapter implements
            OnClickListener {
    
        List<AccountHierarchical> list;
        LayoutInflater inflatter;
        static Context context;
        boolean checkGroup;
        int position;
    
        static ProgressDialog ProgressDialog;
    
        public TreeView( List<AccountHierarchical> list, Context context,
                LayoutInflater inflatter, boolean checkGroup, int position
             ) {
            this.list = list;
            TreeView.context = context;
            this.inflatter = inflatter;
            this.checkGroup = checkGroup; // this is true when you call from inner.
            this.position = position;
    
    
    
        }
    
        @Override
        public Object getChild(int groupPosition, int childPosition) {
    
            return list.get(groupPosition).getList().get(childPosition);
        }
    
        @Override
        public long getChildId(int groupPosition, int childPosition) {
    
            return list.get(groupPosition).getList().get(childPosition).getId();
        }
    
        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
    
            if (checkGroup)
                groupPosition = position;
    
    
    
    
            List<AccountHierarchical> childtemp = list.get(groupPosition)
                    .getList();
    
            // call this adapter again for creating another level
            if (childtemp.get(childPosition).getList().size() > 0) {
                CustExpListview SecondLevelexplv = new CustExpListview(context);
                TreeView adapter  = null;
    
                adapter = new TreeView(childtemp, context,
                            inflatter, true, childPosition);
                SecondLevelexplv.setGroupIndicator(null);
                SecondLevelexplv.setAdapter(adapter);
                return SecondLevelexplv;
            }
            // call one layout, this is last child
            else {
    
                convertView = inflatter.inflate(R.layout.grouprow, null);
                TextView tv = (TextView) convertView.findViewById(R.id.grouprow);
    
    
    
                tv.setText(list.get(groupPosition).getList().get(childPosition)
                        .getTitle());
                tv.setPadding(0, 0, 20, 0);
                convertView.setTag(list.get(groupPosition).getList()
                        .get(childPosition) );
                convertView.setId(position);
                convertView.setOnClickListener(this);
                return convertView;
            }
    
        }
    
        @Override
        public int getChildrenCount(int groupPosition) {
            return list.get(groupPosition).getList().size();
        }
    
        @Override
        public Object getGroup(int groupPosition) {
            return list.get(groupPosition);
        }
    
        @Override
        public int getGroupCount() {
    
            if (checkGroup)
                return 1;
    
            return list.size();
        }
    
        @Override
        public long getGroupId(int groupPosition) {
            return list.get(groupPosition).getId();
        }
    
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
    
            if (convertView == null)
                convertView = inflatter.inflate(R.layout.grouprow, null);
    
            TextView tv = (TextView) convertView.findViewById(R.id.grouprow);
    
            if (checkGroup)
                tv.setText(list.get(position).getTitle());
            else
                tv.setText(list.get(groupPosition).getTitle());
    
            return convertView;
        }
    
        @Override
        public boolean hasStableIds() {
            return false;
        }
    
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
    
            return false;
        }
    
        @Override
        public void onClick(View v) {
            // your onClick method
        }
    
    }
    

    activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/RelativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
         >
    
        <ExpandableListView
            android:id="@+id/expandableList_tree"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" >
    
        </ExpandableListView>
    
    </RelativeLayout>
    

    grouprow.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/RelativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/grouprow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginBottom="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="20dp" 
            android:text=""/>
    
    
    
    </RelativeLayout>
    

    快照:

    【讨论】:

    • 谢谢,您的代码对阅读一项艰巨的任务很有帮助。
    【解决方案2】:

    您需要切换到 Three-Level of Expandable ListView ,其中包含 child 中的 subchild。

    也可以查看ExpandableListView with 3 Childs

    【讨论】:

    • 但是如果我们点击子项只会得到与子项相关的大子数据,而不是在初始阶段,即MainActivity加载
    • 你到底想要什么?
    • 如果我点击 Core 或 Game 我想加载与这 2 个子项相关的列表
    • 是的,这就是我在回答中提供的链接中显示的内容。它将是三层可扩展列表视图。您添加另一个子子项或核心或游戏子项。
    • 好的,感谢您提供的链接,我会尝试并通知您
    【解决方案3】:

    你必须在 xml 文件中创建一个布局(你的核心 textview 来自哪里)并在下面显示一个图像视图 onClick 那个 imageView 你只需要让你的布局消失和可见 我刚刚给你指路了,剩下的就看你的技巧了:)

        <RelativeLayout
            android:id="@+id/option"
            android:layout_width="fill_parent"
            android:layout_height="40dp"
            android:gravity="center"
            android:orientation="horizontal" >
    
        </RelativeLayout>
    
        <RelativeLayout
            android:id="@+id/linear"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:orientation="horizontal" >
    
            <ImageView
                android:id="@+id/navigationIcon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:src="@drawable/nn" />
    
    
            <ImageView
                android:id="@+id/callOption"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/phonee" />
    
            <ImageView
                android:id="@+id/imageViewfeedback"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:src="@drawable/editer" />
        </RelativeLayout>
    

    在 Jave 文件中

    linear.setVisibility(View.GONE);
            option.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    try {
                        if(count==0)
                        {
                            linear.setVisibility(View.VISIBLE);
    
                            count=1;
                        }
                        else
                        {
    
    
                            linear.setVisibility(View.GONE);
                            count=0;
                        }
    
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多