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

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>

接頭辞 を使用する 2 つの要素があることに注意してください-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基本的に Google のドキュメントに記載されているのとまったく同じように機能する に実装されています。ただしsetOnclickListener、それらを追加するときにビューに使用したり、独自の属性を設定できる XML ファイルを使用したりすることもできonClickます...

それが役立つことを願っています=)

于 2013-08-19T21:36:34.950 に答える