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

Jiv*_*vay 33 android separator android-layout android-listview android-adapter

我正在为我的应用程序制作一个菜单,使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*oda 38

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

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

或者本教程:

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

第二个不是那么详细,但可能更容易理解/保持更简单.

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

从教程:

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

  • getViewTypeCount()它返回AdapterView管理的视图类型的数量.大多数情况下,此方法返回1,因为ListView的所有项都相似.在这种情况下,通过返回2,ListView将处理两种类型的视图:常规项视图和分隔符视图
  • getItemViewType(int)必须返回0(包括)和(不包括) 之间的整数getViewTypeCount().给定的数字表示给定位置的视图类型.例如,我们可以确保常规项视图的返回值为0,分隔符的返回值为1


Jiv*_*vay 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>
Run Code Online (Sandbox Code Playgroud)

请注意,我有两个使用前缀的元素-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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这里的要点是代码搜索分隔符的方式,即带-sep-前缀的字符串.找到一个后,将删除前缀,并将匹配的布局归因于分隔符.

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

希望它会有所帮助=)