32

私は現在、DrawerLayoutとArrayAdapterサブクラスを使用して、Facebookの引き出しメニューのようなものを実現する、自分のアプリのメニューを作成しています。セクションセパレータ/ディバイダをListViewに追加するにはどうすればよいですか?

私は現在、リストの作成に問題はありませんが、これはうまく見えるようになりました。異なる種類のオプション(ユーザー関連およびアプリケーション関連のオプション)と検索バーの上にセパレータを追加したいと思います。メニュー。

私の現在の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メソッド関数を呼び出してリストビューを移入関数をオーバーライドする必要があることを前提としていますが、私はそれを機能している見つけることができませんです。

答えて

37

あなたのListViewに簡単なセクションをしたい場合は、このチュートリアルを見てみましょう:

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

またはこのチュートリアル:

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

2番目のものは詳細ではありませんが、わかりやすい/簡単なものです。

基本的な考え方は、あなたのListAdapterにはさまざまな種類のビューを作成させることです。たとえば、情報を表示する実際のリストアイテムが1つの種類で、セクションの仕切りが他の種類のビューである2つの異なるビュー。チュートリアルから

リストビュー、より具体的にアダプタは、ビューのいくつかのタイプを処理することができます。

  • getViewTypeCount()あなた AdapterViewが管理するビューの種類の数を返します:あなたはアダプタインタフェースを見てみた場合、あなたはそれが2つの特定のメソッドが含まれて気づくでしょう。ほとんどの場合、 ListViewのすべての項目が似ているため、このメソッドは1を返します。この場合、2を返すことによって、 リストビューは、ビューの二つのタイプを処理する:定期的なアイテムビュー セパレータビュー
  • getItemViewType(int)は 0(含む)と getViewTypeCount()(排他的)の間の整数を返さなければなりません。指定された数値は、指定された位置のビューのタイプ を表します。例えば、我々は 返された値が セパレータ
+1

は=それに役立つことを願って...あなたのビューにsetOnclickListenerを使用することができ有用である可能性があることが、それは私が探しているものではありません。 [PIC関連](http://www.pocketables.com/images/2013/01/Pages-Manager-1.png)これは私が作成しようとしている種類のメニューです。この種の区切り文字は "Yourページ "とヘルプセンターを保持するセクションです。 – Jivay

+0

それから私は誤解しているに違いない。もっと具体的に説明できますか?何を探していますか? –

+0

が編集されました。完了しないでEnterを押します。私は、私のListViewの特定のセクションの間に特定のセパレータを配置し、このセパレータにタイトルを入れたいと思います。 – Jivay

7

私はこれにに別の方法を理解しましたので、私はここで答えを追加しているため、通常のアイテムビューのための0と1であることを確認することができます。 @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-を使用している2つの要素があります。これらは私たちのセパレータです。 userBarと呼ばれるオブジェクトがあります、このコードで

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; 
    } 
} 

は、その後、私はいくつかの機能を追加しました上で、まだArrayAdapterである私が先に示してきたDrawerMenuAdapterを、来ます。あなたは本当にこれに注意する必要はありませんが、興味があれば、それは別のメニュー要素で、通常のメニュー要素の代わりに特定のレイアウトファイルを使用しています。これは、文字列を読むだけで、任意のレイアウトを任意の場所に追加できることを実証する方法です。

ここでの主なポイントは、コードが区切り文字を検索する方法であり、接頭辞は-sep-です。いったん見つかると、プレフィックスは削除され、一致するレイアウトはセパレータに帰属します。

これは私が見つけたものです。その後、クリックリスナーを追加する独自の方法を見つける必要があります。鉱山はDrawerLayout.setOnCliclListenerに実装されています。これは、基本的にはGoogleの文書に記載されているのと全く同じです。しかし、あなたはそれらを追加し、あなたがあなた自身のonClick属性を設定することができますXMLファイルを使用してもハズレは、

関連する問題