如何将部分分隔符/分隔符添加到 ListView?

Posted

技术标签:

【中文标题】如何将部分分隔符/分隔符添加到 ListView?【英文标题】:How to add section separators / dividers to a ListView? 【发布时间】:2013-08-20 13:58:47 【问题描述】:

我目前正在为我的应用程序制作菜单,使用 DrawerLayout 和 ArrayAdapter 子类来实现类似于 Facebook 抽屉菜单的功能。

我目前在创建列表时没有问题,但现在看起来不错,我想在不同类型的选项(即与用户相关和与应用程序相关的选项)之间添加分隔符,并在列表顶部添加一个搜索栏菜单。

我当前的 ArrayAdaptor 子类的代码如下:

public class DrawerMenuAdapter extends ArrayAdapter<String>
    private Context context;
    private String[] values;
    private int resId;

    public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) 
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
        this.resId = textViewResourceId;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(this.resId, parent, false);

        TextView elementText = (TextView)rowView.findViewById(R.id.element_text);
        ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon);
        String textValue = values[position];

        elementText.setText(textValue);

        //This switch adds the icons to the related elements
        switch (position)
            case 0:
                elementImage.setImageResource(R.drawable.search);
                break;
            case 1:
                elementImage.setImageResource(R.drawable.facebook_friends);
                break;
            case 2:
                elementImage.setImageResource(R.drawable.flirts_history);
                break;
            case 3:
                elementImage.setImageResource(R.drawable.premium);
                break;
            case 4:
                elementImage.setImageResource(R.drawable.settings);
                break;
            case 5:
                elementImage.setImageResource(R.drawable.share_app);
                break;
            case 6:
                elementImage.setImageResource(R.drawable.cgu);
                break;
        


        return rowView;
    

我假设我必须通过调用 getView 函数来覆盖填充 ListView 的函数,但我找不到它是哪个函数。

【问题讨论】:

【参考方案1】:

如果您想要简单的 ListView 中的部分,请查看本教程:

http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/

或本教程:

http://bartinger.at/listview-with-sectionsseparators/

第二个没有那么详细,但可能更容易理解/保持简单。

基本思想是您让您的 ListAdapter 具有不同类型的视图。 例如,两个不同的视图,其中一种是显示信息的实际列表项,另一种视图是部分分隔符。

来自教程:

ListViews,更具体地说是适配器可以处理多种类型的视图。如果你看一下 Adapter 接口,你会发现它包含两个特定的方法:

getViewTypeCount() 返回您的视图类型的数量 AdapterView 管理。大多数情况下,此方法返回 1,因为 ListView 的所有项目都是相似的。在这种情况下,通过返回 2, ListView 将处理两种类型的视图:常规项目视图 和分隔视图 getItemViewType(int) 必须返回介于 0(含)和 getViewTypeCount()(独家)。给定的数字表示类型 给定位置的视图。例如,我们可以确保 返回值为 0 用于常规项目 Views 和 1 用于 分隔符

【讨论】:

不,这可能很有用,但这不是我想要的。 PIC RELATED 这就是我正在尝试制作的菜单,在“您的页面”和包含帮助中心的部分之间使用这种分隔符。 那我一定是误会了。你能更具体地解释一下吗?你在找什么? 已编辑,未完成就按 Enter。我想在我的 ListView 的特定部分之间放置一个特定的分隔符,并在此分隔符上放置一个标题。 第二个链接比较简单,对我有帮助。【参考方案2】:

我在这里添加了一个答案,因为我已经找到了另一种方法来解决这个问题。它看起来有点像@Phil 发布的链接。

首先我设置了一个我想要显示的菜单的字符串数组。为方便起见,我将这个数组写在一个 XML 资源文件中。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array
            name="drawer_menu_options">
        <item>Username</item>
        <item>-sep-Flirter</item>
        <item>Recherche</item>
        <item>Amis Facebook</item>
        <item>Flirts</item>
        <item>Compte premium</item>
        <item>-sep-Menu</item>
        <item>Réglages</item>
        <item>Inviter des amis</item>
        <item>CGU</item>
    </string-array>
</resources>

请注意,我有两个使用前缀 -sep- 的元素。这些将是我们的分隔符。

然后是我之前展示的 DrawerMenuAdapter,它仍然是一个 ArrayAdapter,我在其上添加了一些功能:

public class DrawerMenuAdapter extends ArrayAdapter<String>
    private Context context;
    private String[] values;
    private int resId;
    private int separatorId = 0;
    private int userbarId = 0;

    public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) 
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
        this.resId = textViewResourceId;
    

    public void setSeparator(int resId)
        separatorId = resId;
    

    public void setUserbarId(int resId)
        userbarId = resId;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
        View rowView;

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(userbarId != 0 && values[position].equals("Username"))
            rowView = inflater.inflate(this.userbarId, parent, false);

        else if(separatorId != 0 && values[position].startsWith("-sep-"))
            rowView = inflater.inflate(this.separatorId, parent, false);

        else
            rowView = inflater.inflate(this.resId, parent, false);
        

        TextView elementText = (TextView)rowView.findViewById(R.id.element_text);
        String textValue = values[position];

        /* If the current line is a separator, just display a separator. Otherwise, set the
        matching picture
         */
        if(textValue.startsWith("-sep-"))
            elementText.setText(textValue.substring("-sep-".length()));

        else
            if(textValue.equals("Username"))
                elementText.setText(context.getSharedPreferences("LovRUserSettings", 0)
                        .getString("firstName", "Username"));
            else
                elementText.setText(textValue);
            
            ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon);
            switch (position)
                case 2:
                    elementImage.setImageResource(R.drawable.search);
                    break;
                case 3:
                    elementImage.setImageResource(R.drawable.facebook_friends);
                    break;
                case 4:
                    elementImage.setImageResource(R.drawable.flirts_history);
                    break;
                case 5:
                    elementImage.setImageResource(R.drawable.premium);
                    break;
                case 7:
                    elementImage.setImageResource(R.drawable.settings);
                    break;
                case 8:
                    elementImage.setImageResource(R.drawable.share_app);
                    break;
                case 9:
                    elementImage.setImageResource(R.drawable.cgu);
                    break;
            
        


        return rowView;
    

在这段代码中,有一个名为userBar 的对象。您实际上不需要注意这一点,但如果您有兴趣,它是另一个菜单元素,使用特定的布局文件而不是我用于常规菜单元素的那个。这是一种证明您可以在任何地方添加任何类型的特定布局的方式,只需阅读您的字符串。

这里的重点是代码搜索分隔符的方式,即带有-sep- 前缀的字符串。一旦找到一个,前缀就被移除,匹配的布局被归于分隔符。

好吧,这就是我发现的。在此之后,您必须找到自己的方式来添加点击侦听器。地雷是在DrawerLayout.setOnCliclListener 中实现的,它的工作方式基本上与谷歌文档所说的完全相同。但您也可以在添加视图时使用 setOnclickListener 到您的视图中,并使用 XML 文件在其中设置您自己的 onClick 属性...

希望对您有所帮助 =)

【讨论】:

以上是关于如何将部分分隔符/分隔符添加到 ListView?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Listview.Separated 在列表的开头和结尾添加分隔符

Flutter:如何将 StreamBuilder 与 ListView.separated 一起使用

颤动 listView.Builder 隐藏最后一个列表项的分隔符

UITableView:仅在指定部分启用分隔符

添加项目后划分Listview

如何更改 Android ListView 分隔线的颜色?