【问题标题】:Android Expendable listview with image带有图像的 Android 可扩展列表视图
【发布时间】:2020-05-25 16:14:03
【问题描述】:

我有可展开的列表项,我想添加带有列表的图像 我有每个子列表项的 3 个值(标题、图像链接、id)

这是代码显示列表标题和子列表标题 我想在 list 中显示 image_link 和 title,在 sublist 中显示 image_link、title、id 如何在适配器中传递 id、image? 请帮忙。

对不起,我的英语不好。

expandableListView = (ExpandableListView) findViewById(R.id.expandableListView);
        expandableListDetail = ExpandableListViewData.getData();
        expandableListTitle = new ArrayList<String>(expandableListDetail.keySet());
        expandableListAdapter = new CustomExpandableListview(this, expandableListTitle, expandableListDetail);
        expandableListView.setAdapter(expandableListAdapter);


public class CustomExpandableListview extends BaseExpandableListAdapter {

        private Context context;
        private List<String> expandableListTitle;
        private HashMap<String, List<String>> expandableListDetail;

        public CustomExpandableListview(Context context, List<String>
                expandableListTitle,HashMap<String, List<String>> expandableListDetail) {
            this.context = context;
            this.expandableListTitle = expandableListTitle;
            this.expandableListDetail = expandableListDetail;
        }

        @Override
        public Object getChild(int listPosition, int expandedListPosition) {
            return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
                    .get(expandedListPosition);
        }

        @Override
        public long getChildId(int listPosition, int expandedListPosition) {
            return expandedListPosition;
        }

        @Override
        public boolean hasStableIds() {
            return false;
        }

        @Override
        public View getChildView(int listPosition, final int expandedListPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent) {
            final String expandedListText = (String) getChild(listPosition, expandedListPosition);
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.list_row, null);
            }
            TextView expandedListTextView = (TextView) convertView
                    .findViewById(R.id.title);
            expandedListTextView.setText(expandedListText);
            return convertView;
        }

        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return false;
        }

        @Override
        public int getChildrenCount(int listPosition) {
            return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
                    .size();
        }

        @Override
        public Object getGroup(int listPosition) {
            return this.expandableListTitle.get(listPosition);
        }

        @Override
        public int getGroupCount() {
            return this.expandableListTitle.size();
        }

        @Override
        public long getGroupId(int listPosition) {
            return listPosition;
        }

        @Override
        public View getGroupView(int listPosition, boolean isExpanded,
                                 View convertView, ViewGroup parent) {
            String listTitle = (String) getGroup(listPosition);
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) this.context.
                        getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.list_group, null);
            }
            TextView listTitleTextView = (TextView) convertView
                    .findViewById(R.id.listTitle);
            listTitleTextView.setTypeface(null, Typeface.BOLD);
            listTitleTextView.setText(listTitle);
            return convertView;
        }
    }

    public static class ExpandableListViewData {
        public static HashMap<String, List<String>> getData() {
            HashMap<String, List<String>> expandableListDetail = new HashMap<String, List<String>>();
            List<String> Xbox = new ArrayList<String>();
            Xbox.add("Halo");
            Xbox.add("Gears of War");
            List<String> Ps4 = new ArrayList<String>();
            Ps4.add("God of War");
            Ps4.add("Spiderman");

            List<String> Switch = new ArrayList<String>();
            Switch.add("Let's Go Pikachu/Eevee");
            Switch.add("Zelda Breath of the Wild");
            Switch.add("Splatoon");

            expandableListDetail.put("Xbox Exclusives", Xbox);
            expandableListDetail.put("Ps4 Exclusives", Ps4);
            expandableListDetail.put("Switch Exclusives", Switch);
            return expandableListDetail;
        }
    }


list_group.xml

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"/>
    <TextView
        android:id="@+id/listTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textColor="@android:color/black"
        android:paddingTop="10dp"
        android:paddingBottom="10dp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>


list_row.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingStart="8dp"
    android:background="@drawable/list_row"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <ImageView
    android:focusable="false"
        android:id="@+id/list_image"
        android:layout_width="30dp"
        android:layout_height="30dp"
        app:srcCompat="@mipmap/logo" />

    <TextView
    android:focusable="false"
    android:layout_gravity="center"
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="#fff"
        android:layout_marginLeft="10dp"/>
        </LinearLayout>



【问题讨论】:

    标签: android expandablelistview


    【解决方案1】:

    创建自定义对象并将其传递给适配器

    ListItem.java

    public class ListItem {
    private String title;
    private String imageUrl;
    private ArrayList<Items> items;
    
    public ListItem(String title, String imageUrl, ArrayList<Items> items) {
        this.title = title;
        this.imageUrl = imageUrl;
        this.items = items;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public String getImageUrl() {
        return imageUrl;
    }
    
    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
    
    public ArrayList<Items> getItems() {
        return items;
    }
    
    public void setItems(ArrayList<Items> items) {
        this.items = items;
    }
    
    }
    

    Items.java

    public class Items {
    private String title;
    private String imageUrl;
    private Integer id;
    
    public Items(String title, String imageUrl, Integer id) {
        this.title = title;
        this.imageUrl = imageUrl;
        this.id = id;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public String getImageUrl() {
        return imageUrl;
    }
    
    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
    
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    }
    

    CustomExpandableListView.java

    public class CustomExpandableListView extends BaseExpandableListAdapter {
    private Context context;
    private ArrayList<ListItem> list;
    
    public CustomExpandableListView(Context context, ArrayList<ListItem> list) {
        this.context = context;
        this.list = list;
    }
    
    @Override
    public int getGroupCount() {
        return this.list.size();
    }
    
    @Override
    public int getChildrenCount(int groupPosition) {
        return this.list.get(groupPosition).getItems().size();
    }
    
    @Override
    public Object getGroup(int groupPosition) {
        return this.list.get(groupPosition);
    }
    
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return this.list.get(groupPosition).getItems().get(childPosition);
    }
    
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
    
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
    
    @Override
    public boolean hasStableIds() {
        return false;
    }
    
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ListItem item = (ListItem) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            assert layoutInflater != null;
            convertView = layoutInflater.inflate(R.layout.list_group, null);
        }
        TextView listTitleTextView = convertView
                .findViewById(R.id.listTitle);
        ImageView listImageView = convertView.findViewById(R.id.groupImageView);
        listTitleTextView.setTypeface(null, Typeface.BOLD);
        listTitleTextView.setText(item.getTitle());
        Glide.with(context)
                .load(item.getImageUrl())
                .into(listImageView);
        return convertView;
    }
    
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final Items item = (Items) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            assert layoutInflater != null;
            convertView = layoutInflater.inflate(R.layout.list_row, null);
        }
        TextView expandedListTextView = convertView
                .findViewById(R.id.title);
        ImageView imageView = convertView.findViewById(R.id.child_image);
        expandedListTextView.setText(item.getTitle());
        Glide.with(context)
                .load(item.getImageUrl())
                .into(imageView);
        return convertView;
    }
    
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
    }
    

    ExpandableListView.java

    public class ExpandableListViewData {
    public static ArrayList<ListItem> getData() {
    
        ArrayList<ListItem> list = new ArrayList<>();
        ArrayList<Items> xBoxItems = new ArrayList<>();
        ArrayList<Items> ps4Items = new ArrayList<>();
        ArrayList<Items> switchItems = new ArrayList<>();
        xBoxItems.add(
                new Items(
                        "Halo",
                        "https://compass-ssl.xbox.com/assets/a5/f4/a5f4cc7b-974b-48e4-b976-f57b3bb97665.jpg?n=Halo-Franchise-2019_Super-Hero-1400_MCC_1920x1080_02.jpg",
                        1
                )
        );
        xBoxItems.add(new Items(
                "Gods of War",
                "https://i.pinimg.com/474x/39/c0/b3/39c0b3954de638a885b28180aeaedf3d.jpg",
                1
        ));
        list.add(
                new ListItem(
                        "Xbox Exclusive",
                        "https://mylatestnews.org/wp-content/uploads/2018/09/XboxOneS_CnsleCntrllr_Hrz_FrntTlt_TransBG_RGB.0.jpg",
                        xBoxItems
                )
        );
        ps4Items.add(
    
                new Items(
                        "God of War",
                        "https://i.pinimg.com/474x/39/c0/b3/39c0b3954de638a885b28180aeaedf3d.jpg",
                        2
                )
        );
        ps4Items.add(new Items(
                "Spiderman",
                "https://images.theconversation.com/files/175539/original/file-20170626-315-1h7k01d.jpg",
                3
        ));
        list.add(
                new ListItem(
                        "Ps4 Exclusives",
                        "https://specials-images.forbesimg.com/imageserve/5e054fc425ab5d0007cf52ca/960x0.jpg",
                        ps4Items
                )
        );
    
        switchItems.add(
                new Items(
                        "Let's Go Pikachu/Eevee",
                        "https://i.pinimg.com/474x/39/c0/b3/39c0b3954de638a885b28180aeaedf3d.jpg",
                        1
                )
    
        );
        switchItems.add(new Items(
                "Zelda Breath of the Wild",
                "https://images.theconversation.com/files/175539/original/file-20170626-315-1h7k01d.jpg",
                1
        ));
    
        switchItems.add(
                new Items(
                        "Splatoon",
                        "https://images.theconversation.com/files/175539/original/file-20170626-315-1h7k01d.jpg",
                        1
                ));
    
        list.add(
                new ListItem(
                        "Switch Exclusives",
                        "https://www.nintendo.com/content/dam/noa/en_US/hardware/switch/nintendo-switch-new-package/gallery/bundle_color_portable%20(1).jpg",
                        switchItems
                )
        );
        return list;
    }
    }
    

    MainActivity.java

    一次只能扩展一个
    public class MainActivity extends AppCompatActivity {
    private int lastPosition = -1;
    
    @Override
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        final ExpandableListView expandableListView = findViewById(R.id.expandableListView);
        ArrayList<ListItem> list = ExpandableListViewData.getData();
        CustomExpandableListView expandableListAdapter = new CustomExpandableListView(this, list);
        expandableListView.setAdapter(expandableListAdapter);
        expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                if (lastPosition != -1
                        && groupPosition != lastPosition) {
                    expandableListView.collapseGroup(lastPosition);
                }
                lastPosition = groupPosition;
            }
        });
    
    }
    }
    

    list_group.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    
    <ImageView
     android:id="@+id/groupImageView"
     android:layout_width="30dp"
     android:layout_height="30dp"
     android:layout_marginStart="40dp"
     android:layout_marginLeft="40dp"
     tools:src="@mipmap/ic_launcher" />
    
    <TextView
     android:id="@+id/listTitle"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center"
     android:gravity="center_vertical"
     tools:text="Title"
     android:paddingStart="20dp"
     android:paddingEnd="20dp"
     android:textColor="@android:color/black"
     tools:ignore="RtlSymmetry" />
    </LinearLayout>
    

    list_row.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:orientation="horizontal"
    android:paddingStart="8dp"
    android:paddingLeft="8dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    tools:ignore="RtlSymmetry">
    
    <ImageView
    android:id="@+id/child_image"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_marginStart="40dp"
    android:layout_marginLeft="40dp"
    android:focusable="false"
    tools:srcCompat="@mipmap/ic_launcher_round" />
    
    <TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginStart="10dp"
    android:gravity="center"
    android:layout_marginLeft="10dp"
    android:focusable="false"
    android:textColor="#000000"
    tools:text="Title" />
    </LinearLayout>
    

    添加这个

    build.gradle(app)

    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    

    添加这个

    AndroidManifest.xml

    <uses-permission android:name="android.permission.INTERNET"/>
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多