【问题标题】:How to add section separators / dividers to a ListView?如何将部分分隔符/分隔符添加到 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 的函数,但我找不到它是哪个函数。

【问题讨论】:

    标签: android android-layout android-listview android-adapter separator


    【解决方案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 属性...

    希望对您有所帮助 =)

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2019-09-08
      • 2015-12-08
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多