在android列表视图中使用合并适配器显示多个视图

时间:2015-02-18 08:49:21

标签: android android-listview view

我有一个问题,我需要在一个列表项中显示两个文本视图。

一个视图显示该项目,单击该项目将打开该项目。 另一个视图是一个加号图标,用它的子项扩展列表。

我摸不着头脑,但找不到方法来检测列表视图中选择了哪个视图。

不知怎的,我想出了MergeAdapter,我跟着它并添加了两个适配器。 第一个适配器显示实际标题,而另一个只显示加号图标。

但是列表只显示第一个文本视图,而不是加号图标。

MergeAdapter我还需要显示两个观点吗?

显示标题,点击此标题应打开所选标题页

`

public class TitleAdapter extends BaseAdapter {

    private List<Title> navItems;
    private LayoutInflater layoutInflater;

    public TitleAdapter(Context context, List<Title> navItems) {
        this.layoutInflater = LayoutInflater.from(context);
        this.navItems = navItems;       
    }
    @Override
    public int getCount() {
        return navItems.size();
    }

    @Override
    public Object getItem(int position) {
        return navItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return navItems.get(position).getTitleID();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;

        TextView textView = null;

        if(convertView == null) {
            view = layoutInflater.inflate(R.layout.drawer_list_item, parent, false);

        } else {
            view = convertView;
        }

        textView = (TextView) view.findViewById(R.id.textView);

        Title item = (Title)getItem(position);

        textView.setText(item.getTitle());

        return view;
    }
}

`

显示+图标,单击它应该在列表中添加新条目,即所选标题的子项

`

public class ExpandAdapter extends BaseAdapter {

    private int items;
    private LayoutInflater layoutInflater;

    public ExpandAdapter(Context context, int items) {
        this.layoutInflater = LayoutInflater.from(context);
        this.items = items;

    }
    @Override
    public int getCount() {
        return items;
    }

    @Override
    public Object getItem(int position) {
        return "+";
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;

        if(convertView == null) {
            view = layoutInflater.inflate(R.layout.drawer_list_item2, parent, false);

        } else {
            view = convertView;
        }

        return view;
    }
}

`

drawer_list_item: `

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/textView"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:textColor="@color/dark_grey"
          android:textSize="20sp"
          android:textStyle="normal"
          style="?android:attr/listSeparatorTextViewStyle"
          android:text="Hi" />

`

drawer_list_item2:

`

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/expandBtn"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:textColor="@color/dark_grey"
          android:textSize="20sp"
          android:textStyle="normal"
          style="?android:attr/listSeparatorTextViewStyle"
          android:text="+" />

`

但是我看不到加号图标了!

我在MergeAdapter中添加了这样的内容:

`

MergeAdapter m = new MergeAdapter();        
TitleAdapter t = new TitleAdapter(this, navItems, hasChild);
ExpandAdapter e = new ExpandAdapter(this, navItems.size());
m.addAdapter(t);
m.addAdapter(e);

`

2 个答案:

答案 0 :(得分:1)

您可以使用ExpandableListView来显示它自己的下拉指示符。您也可以更改您选择的图标。它只需要一个adapter,您可以单独填充childparent。 如果要求与此有所不同,请提及我们可以讨论。

如果您不想使用此功能,可以使用单个自定义适配器执行此操作,并为其添加自定义布局。填充后,将单击侦听器添加到加号按钮,然后onClick处理第二个文本项的可见性。

OR

如果您想要多层列表,可能需要检查this项目。我没试过,但我想这值得一试。默认的ExpanadableListView仅限于支持2个级别。你可以自定义它以支持更多级别,但它会更加复杂。

答案 1 :(得分:0)

ExpandableListView的最佳示例演示。

https://github.com/idunnololz/AnimatedExpandableListView