【问题标题】:How to add image in expandable List in parent in android?如何在android父级的可扩展列表中添加图像?
【发布时间】:2009-08-30 04:40:10
【问题描述】:

是否可以在可扩展列表中自定义子项?

【问题讨论】:

    标签: android expandablelistview expandablelistadapter


    【解决方案1】:

    使用SimpleExpandableListAdapter 绝非易事。假设您使用的是ExpandableListActivity,下面是一些可以帮助您入门的代码。

    在这个例子中,我们使用标准的android.R.layout.simple_expandable_list_item_1 作为我们的组头视图,但我们使用我们自己的自定义布局给孩子们。

        // Construct Expandable List
        final String NAME = "name";
        final String IMAGE = "image";
        final LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final ArrayList<HashMap<String, String>> headerData = new ArrayList<HashMap<String, String>>();
    
        final HashMap<String, String> group1 = new HashMap<String, String>();
        group1.put(NAME, "Group 1");
        headerData.add( group1 );
    
        final HashMap<String, String> group2 = new HashMap<String, String>();
        group2.put(NAME, "Group 2");
        headerData.add( group2);
    
    
        final ArrayList<ArrayList<HashMap<String, Object>>> childData = new ArrayList<ArrayList<HashMap<String, Object>>>();
    
        final ArrayList<HashMap<String, Object>> group1data = new ArrayList<HashMap<String, Object>>();
        childData.add(group1data);
    
        final ArrayList<HashMap<String, Object>> group2data = new ArrayList<HashMap<String, Object>>();
        childData.add(group2data);
    
    
        // Set up some sample data in both groups
        for( int i=0; i<10; ++i) {
            final HashMap<String, Object> map = new HashMap<String,Object>();
            map.put(NAME, "Child " + i );
            map.put(IMAGE, getResources().getDrawable(R.drawable.icon));
            ( i%2==0 ? group1data : group2data ).add(map);
        }
    
        setListAdapter( new SimpleExpandableListAdapter(
                this,
                headerData,
                android.R.layout.simple_expandable_list_item_1,
                new String[] { NAME },            // the name of the field data
                new int[] { android.R.id.text1 }, // the text field to populate with the field data
                childData,
                0,
                null,
                new int[] {}
            ) {
                @Override
                public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
                    final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);
    
                    // Populate your custom view here
                    ((TextView)v.findViewById(R.id.name)).setText( (String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NAME) );
                    ((ImageView)v.findViewById(R.id.image)).setImageDrawable( (Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(IMAGE) );
    
                    return v;
                }
    
                @Override
                public View newChildView(boolean isLastChild, ViewGroup parent) {
                     return layoutInflater.inflate(R.layout.expandable_list_item_with_image, null, false);
                }
            }
        );
    

    在您的自定义子布局中,命名为expandable_list_item_with_image.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right" />
    
    </RelativeLayout>
    

    【讨论】:

    • 只想说这是一个很好的例子,真的很有帮助!谢谢
    • @emmby 你好如何为父母的每个孩子添加不同的图像和文本,即
    • 你知道有什么教程吗
    【解决方案2】:

    您可以尝试制作自己的列表适配器来扩展 BaseExpandableListAdapter,就像在 documentation 中描述的那样。

    然后覆盖getGroupView(..)(父项,或getChildView子项)函数,在这个函数中你可以膨胀你自己的布局xml。

    类似这样的:

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                ViewGroup parent) 
            {
                View v = convertView;
                if (v == null) {
        //sender is activity from where you call this adapter. Set it with construktor.
                    LayoutInflater vi = (LayoutInflater)sender.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
                    v = vi.inflate(R.layout.row, null);
                }
    //children = arraylists of Child 
                Child c = children.get(childPosition);
                if (c != null) {
                        TextView tt = (TextView) v.findViewById(R.id.toptext);
                        TextView bt = (TextView) v.findViewById(R.id.bottomtext);
                        ImageView icon = (ImageView) v.findViewById(R.id.rowicon);
                        if (tt != null) {
                              tt.setText(c.text1);                            }
                        if(bt != null){
                              bt.setText(c.text2);
                        }
                        if (icon != null) 
                        {
                            icon.setImageResource(R.drawable.rowicon);
                        }
                }
                return v;
            }
    

    布局xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:padding="6dip">
        <ImageView
            android:id="@+id/rowicon"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginRight="6dip" />
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="0dip"
            android:layout_weight="1"
            android:layout_height="fill_parent">
            <TextView
                android:id="@+id/toptext"
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1"
                android:gravity="center_vertical"
            />
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="0dip"
                android:layout_weight="1" 
                android:id="@+id/bottomtext"
                android:singleLine="true"
                android:ellipsize="marquee"
            />
        </LinearLayout>
    </LinearLayout>
    

    【讨论】:

      【解决方案3】:

      覆盖getGroupView后,可以使用setCompoundDrawablesWithIntrinsicBounds函数添加图片。

      @Override
      public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
      {
        View v = super.getGroupView(groupPosition, isExpanded, convertView, parent);
        TextView tv = (TextView) v.findViewById(R.id.textViewId);
      
        tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.imageToAdd, 0, 0, 0);
      
        return v;
      }
      

      【讨论】:

        【解决方案4】:

        我刚刚找到了一个更好的方法,你可以简单地添加

        android:drawableRight="@drawable/icon" 行布局列表组的 xml 文件。

        【讨论】:

          【解决方案5】:

          试试这个>>> Tutorial

          您可以更新它以便在子 xml 文件中添加图像而不是文本

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-19
            • 1970-01-01
            • 2014-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多