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

时间:2013-08-18 18:42:15

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

我正在为我的应用程序制作菜单,使用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的函数,但我找不到它是哪个函数。

2 个答案:

答案 0 :(得分:38)

如果您想在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表示常规项目视图,1表示 分离器

答案 1 :(得分:7)

我在这里添加了一个答案,因为我已经找到了另一种方法。它看起来有点像@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-前缀的字符串。找到一个后,将删除前缀,并将匹配的布局归因于分隔符。

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

希望它会有所帮助=)