android - 如何制作一个可打开的部分列表视图

时间:2016-02-23 05:29:47

标签: android listview

我想制作一个这样的部分列表视图,因为你可以看到每个部分都有一些孩子。

enter image description here

当我点击每个部分时,它会打开并显示该部分的子项。 我怎么能做这样的事情?

2 个答案:

答案 0 :(得分:0)

使用ExpandableListView而不是普通的ListView

 <ExpandableListView
            android:id="@+id/listSlidermenu"
            android:layout_width="275dp"
            android:layout_height="match_parent"
            android:layout_gravity="right"
            android:layout_marginTop="2dp"
            android:background="@color/background"
            android:choiceMode="singleChoice"
            android:groupIndicator="@null" />

适配器:

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<ExpandableListHeaderItem> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<ExpandableListHeaderItem, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<ExpandableListHeaderItem> listDataHeader,
                                 HashMap<ExpandableListHeaderItem, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        ExpandableListHeaderItem headerTitle = (ExpandableListHeaderItem) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        ImageView headerIcon = (ImageView) convertView
                .findViewById(R.id.iconImageView);
        headerIcon.setImageResource(headerTitle.getIcon());
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle.getItemName());

        return convertView;
    }

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

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

答案 1 :(得分:0)

最佳解决方案是使用ExpandableListView