34

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

4

2 回答 2

38

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

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

或本教程:

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

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

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

从教程:

ListViews,更具体地说是Adapters 可以处理几种类型的 Views。如果你看一下 Adapter 接口,你会注意到它包含两个特定的方法:

  • getViewTypeCount()它返回您的 AdapterView 管理的视图类型的数量。大多数情况下,此方法返回 1,因为 ListView 的所有项目都相似。在这种情况下,通过返回 2,ListView 将处理两种类型的 Views:常规项 Views 和分隔符 Views
  • getItemViewType(int)必须返回一个介于0(包括)和 (不包括)之间的整数getViewTypeCount()。给定的数字表示给定位置的视图类型。例如,我们可以确保常规项目 Views 的返回值为 0,分隔符的返回值为 1
于 2013-08-18T18:47:59.170 回答
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-前缀的字符串。一旦找到一个,前缀就被删除,匹配的布局被归于分隔符。

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

希望它会有所帮助=)

于 2013-08-19T21:36:34.950 回答