【问题标题】:How to populate different child under Expandable listview?如何在可扩展列表视图下填充不同的子项?
【发布时间】:2015-05-04 05:23:42
【问题描述】:

我在扩展可扩展列表视图时遇到问题。我想这样表演:

为此,我采用这样的列表视图项目:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:background="#112234"
android:orientation="horizontal">

<CheckedTextView
    android:id="@+id/checkedtextViewZoneItem"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:paddingLeft="30dp"
    android:paddingTop="10dp"
    android:gravity="center_vertical"
    android:drawableLeft="?android:attr/listChoiceIndicatorMultiple"/>

<TextView
    android:id="@+id/txtViewZoneItem"
    android:layout_width="wrap_content"
    android:layout_height="45dp"
    android:background="#112234"
    android:textColor="#C3C7D2"
    android:textSize="18dip"
    android:paddingTop="10dp"/>    

在我的 UI 对应物上,我放置了一个 GroupExpandListener。我能够点击删除按钮。但是在单击该删除按钮后,我没有找到任何隐藏/可见特定组项目复选框的方法。对于组标题点击我是这样执行的:

 // Listview Group expanded listener
    expListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
        @Override
        public void onGroupExpand(final int groupPosition) {

            View parentView =  expListView.findViewWithTag(groupPosition);
            ImageView deleteZoneItem = (ImageView) parentView.findViewById(R.id.imageViewDeleteZoneItems);
            deleteZoneItem.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {

                    if(!expListView.isGroupExpanded(groupPosition)) {
                        Toast.makeText(ZoneListActivity.this, "expand", Toast.LENGTH_SHORT).show();
                        expListView.expandGroup(groupPosition);
                    }
                }
            });


        }
    });

请建议我一个解决方法,要么我需要对我的 customAdapter 类进行更改,要么我只能通过我的活动类来执行。

问候,

安卓极客

【问题讨论】:

    标签: android android-layout android-listview expandablelistview


    【解决方案1】:

    可以这样做: 您应该有一个扩展 BaseExpandableAdapter 的自定义适配器;一个组对象,其中包含 isDeletable 布尔标志、组名和子对象列表(在您的情况下为字符串)。

    当用户扩展组时,您可以按位置从适配器中检索该组,并在是否按下删除按钮时设置 isDeletable 标志。

    在适配器的 getChildView 方法中,您还可以检索组,检查标志并设置复选框的可见性或您需要的东西。

    更新,一个示例。 看看我的自定义适配器实现:

    public class CustomAdapter extends BaseExpandableListAdapter {
    
    public static class GroupItem {
        private String groupName;
        private List<String> items;
        private boolean isDeletable;
    
        public GroupItem(String groupName, List<String> items) {
            this.groupName = groupName;
            this.items = items;
        }
    
        public String getGroupName() {
            return groupName;
        }
        public List<String> getItems() {
            return items;
        }
    
        public void setDeletable(boolean isDeletable) {
            this.isDeletable = isDeletable;
        }
    }
    
    private List<GroupItem> groups;
    private Context context;
    
    public CustomAdapter(Context context, List<GroupItem> groups) {
        this.groups = groups;
        this.context = context;
    }
    
    @Override
    public int getGroupCount() {
        return groups.size();
    }
    
    @Override
    public int getChildrenCount(int groupPosition) {
        return getGroup(groupPosition).getItems().size();
    }
    
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup container) {
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.item_group, container, false);
        }
    
        ((TextView) convertView).setText(getGroup(groupPosition).getGroupName());
    
        return convertView;
    }
    
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup container) {
        ChildViewHolder viewHolder;
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.item_child, container, false);
            viewHolder = new ChildViewHolder();
            viewHolder.text = (TextView)convertView.findViewById(R.id.textView);
            viewHolder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ChildViewHolder)convertView.getTag();
        }
    
        GroupItem group = getGroup(groupPosition);
        String item = getChild(groupPosition, childPosition);
        viewHolder.text.setVisibility(group.isDeletable ? View.GONE : View.VISIBLE);
        viewHolder.checkbox.setVisibility(group.isDeletable ? View.VISIBLE : View.GONE);
    
        return convertView;
    }
    
    @Override
    public GroupItem getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }
    
    @Override
    public String getChild(int groupPosition, int childPosition) {
        return getGroup(groupPosition).getItems().get(childPosition); }
    

    }

    viewHolder.text.setVisibility(group.isDeletable ? View.GONE : View.VISIBLE);
    viewHolder.checkbox.setVisibility(group.isDeletable ? View.VISIBLE : View.GONE);
    

    做你想做的事

    您可以在适当的组中设置 isDeletable 标志,并使用 groupPosition (在您的示例中)检索它,然后调用 expandGroup

    【讨论】:

    • 我已经在用 BaseExpandableAdapter 扩展一个类。第一个问题。这是我如何在 getChildView 方法中单击该 java 文件的删除按钮。即使我得到那个点击,是否有可能在那个按钮点击上展开标题或设置可见性??
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多