2016-04-18 14 views
1

In diesem Beispiel zeigen wir, wie Sie eine ListView mit Abschnitt Header erstellen. Dies beinhaltet folgende SchritteWie erstellt man einen Android-ListView mit Abschnitt Header Xamarin Android? Ich habe 17 Fehler

Erstellen Sie zwei benutzerdefinierte Layout für Ihre Listenkopf und Liste Reihe Ihren kundenspezifischen Adapter für Instantiate Listview Listview Erstellen Sie in Ihrer Tätigkeit

ich 17 Fehler bekommen hatte. Ich möchte Listenansicht mit Abschnitt Header Xamarin Android erstellen. http://javatechig.com/android/listview-with-section-header-in-android

ich von Java zu konvertieren C#

> - `public class CustomAdapter:BaseAdapter`->does not implement abstract member `android.widget.baseAdapter.getitem(int)` 
 
> - `Android.Widget.BaseAdapter.NotifyDataSetChanged()`-> An object reference is requered to access non-static member ..... 
 
> - `return mData.GetRange(position)`;-> no overload for method 'getrange'take 1 arguments 
 
> - `convertView = mInflater.Inflate(Resource.Layout.textViewHeaderItems, false)`;-> the 
 
> best overloaded method match for ..... has some invalid arguments 
 
> - `convertView.SetTag(holder);`-> no overload for method ... tkae 2 arguments 
 
> - `holder.textView.SetText(mData.get(position))`; type system.collection.generic.list<string> does not contain a defintion 
 
> for 'get'and no extension method 'get'of type 
 
> `system.Colleciton.Generic.List<string>` could be found. Are you 
 
> missing an assembly

public class CustomAdapter:BaseAdapter 
 
\t \t { 
 
\t \t \t private const int TYPE_ITEM = 0; 
 
\t \t \t private const int TYPE_SEPARATOR = 1; 
 

 
\t \t \t private List<String> mData = new List<String>(); 
 
\t \t \t private TreeSet sectionHeader = new TreeSet(); 
 

 
\t \t \t private LayoutInflater mInflater; 
 

 
\t \t \t public CustomAdapter(Context context) { 
 
\t \t \t \t mInflater = (LayoutInflater) context 
 
\t \t \t \t \t .GetSystemService(Context.LayoutInflaterService); 
 
\t \t \t } 
 

 
\t \t \t public void addItem(String item) { 
 
\t \t \t \t mData.Add(item); 
 
\t \t \t \t Android.Widget.BaseAdapter.NotifyDataSetChanged(); 
 
\t \t \t } 
 

 
\t \t \t public void addSectionHeaderItem(String item) { 
 
\t \t \t \t mData.Add(item); 
 
\t \t \t \t sectionHeader.Add(mData.Count - 1); 
 
\t \t \t \t Android.Widget.BaseAdapter.NotifyDataSetChanged(); 
 
\t \t \t } 
 

 
\t \t 
 
\t \t \t public int getItemViewType(int position) { 
 
\t \t \t \t return sectionHeader.Contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
 
\t \t \t } 
 

 
\t 
 
\t \t \t public int getViewTypeCount() { 
 
\t \t \t \t return 2; 
 
\t \t \t } 
 

 
\t 
 
\t \t \t public int getCount() { 
 
\t \t \t \t return mData.Count; 
 
\t \t \t } 
 

 
\t \t 
 
\t \t \t public String getItem(int position) { 
 
\t \t \t \t return mData.GetRange(position); 
 
\t \t \t } 
 

 
\t \t 
 
\t \t \t public long getItemId(int position) { 
 
\t \t \t \t return position; 
 
\t \t \t } 
 

 
\t \t \t public View getView(int position, View convertView, ViewGroup parent) { 
 
\t \t \t \t ViewHolder holder = null; 
 
\t \t \t \t int rowType = getItemViewType(position); 
 

 
\t \t \t \t if (convertView == null) { 
 
\t \t \t \t \t holder = new ViewHolder(); 
 
\t \t \t \t \t switch (rowType) { 
 
\t \t \t \t \t case TYPE_ITEM: 
 
\t \t \t \t \t \t convertView = mInflater.Inflate(Resource.Layout.textViewHeaderItems, false); 
 
\t \t \t \t \t \t holder.textView = (TextView) convertView.FindViewById(Resource.Id.textviewHeaderItems); 
 
\t \t \t \t \t \t break; 
 
\t \t \t \t \t case TYPE_SEPARATOR: 
 
\t \t \t \t \t \t convertView = mInflater.Inflate(Resource.Layout.textViewItemsSeparator, false); 
 
\t \t \t \t \t \t holder.textView = (TextView) convertView.FindViewById(Resource.Id.textviewItemsSeparator); 
 
\t \t \t \t \t \t break; 
 
\t \t \t \t \t } 
 
\t \t \t \t \t convertView.SetTag(holder); 
 
\t \t \t \t } else { 
 
\t \t \t \t \t holder = (ViewHolder) convertView.GetTag(); 
 
\t \t \t \t } 
 
\t \t \t \t holder.textView.SetText(mData.get(position)); 
 

 
\t \t \t \t return convertView; 
 
\t \t \t } 
 

 
\t \t \t public class ViewHolder { 
 
\t \t \t \t public TextView textView; 
 
\t \t \t } 
 
\t \t }

Antwort

1

Sie sollten die Funktion "Suchen" auf Xamarin Dev Website für Fragen wie diese verwenden :

Hinweis: Google oder Bing ist auch dein bester Freund für Fragen wie diese.

Android.Content.Context.LayoutInflaterService

Verwendung mit Context.GetSystemService (String) eine LayoutInflater zum Aufblasen Layout Ressourcen in diesem Zusammenhang abzurufen.

https://developer.xamarin.com/api/field/Android.Content.Context.LayoutInflaterService/

Android.Widget.BaseAdapter.NotifyDataSetChanged

Benachrichtigt die beigefügten Beobachter, dass die zugrunde liegenden Daten geändert worden ist, und jede Ansicht des Datensatzes zulässt, sollte sich erfrischen.

https://developer.xamarin.com/api/member/Android.Widget.BaseAdapter.NotifyDataSetChanged/

Java.Util.TreeSet

TreeSet ist eine Implementierung von SortedSet.

https://developer.xamarin.com/api/type/Java.Util.TreeSet/

+0

ich uns die „Suche“, aber es gibt viele Informationen. Ich verstehe nicht –

+0

kann nicht Treeset verwenden <> –

+0

Mein Beitrag aktualisiert. bitte kannst du es überprüfen –

0

Ich habe ein Problem läuft, wo ich auch ein ListView mit Abschnittsüberschriften basierend auf this blog post Erstellung endete. Hier ist die Art, wie ich es tat, falls jemand läuft in das gleiche Problem:

Definieren Sie ein Layout für den Header und das Listenelement, das innerhalb des ListView bevölkert wird:

adapter_expandable_listview_header. xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/adapter_expandable_listview_header_textview" 
     android:layout_width="match_parent" 
     android:text="Header" 
     android:textStyle="bold" 
     android:textSize="14sp" 
     android:textColor="@color/textColorSecondary" 
     android:layout_height="wrap_content" 
     android:layout_margin="16dp" /> 
</LinearLayout> 

adapter_expandable_listview_listitem.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minWidth="25px" 
    android:minHeight="25px"> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/relativeLayout1" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     android:layout_marginTop="16dp" 
     android:layout_marginBottom="20dp" 
     android:descendantFocusability="blocksDescendants"> 
     <TextView 
      android:text="Rüttenscheider Stern" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/adapter_expandable_listview_listitem_textview1" 
      android:textSize="16sp" 
      android:textColor="@color/textColorPrimary" /> 
     <TextView 
      android:text="Essen" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/adapter_expandable_listview_listitem_textview1" 
      android:id="@+id/adapter_expandable_listview_listitem_textview2" 
      android:textSize="14sp" /> 
     <TextView 
      android:text="Rüttenscheiderstraße" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/adapter_expandable_listview_listitem_textview2" 
      android:id="@+id/adapter_expandable_listview_listitem_textview3" 
      android:textSize="14sp" /> 
     <ImageButton 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:id="@+id/adapter_expandable_listview_listitem_overflow_button" 
      android:src="@drawable/ic_dots_vertical_grey600_18dp" 
      android:background="@null" /> 
    </RelativeLayout> 
    <View 
     android:layout_width="match_parent" 
     android:layout_marginLeft="16dp" 
     android:layout_height="1dp" 
     android:background="@color/material_grey_300" /> 
</LinearLayout> 

Und hier ist der Adapter für die ListView:

SectionedHeaderListViewAdaper.cs

namespace YourNamespace 
{ 
    /// <summary> 
    /// Used to pass groups of objects to the adapter. 
    /// </summary> 
    internal class ExpandableItem 
    { 
     public string HeaderTitle; 
     public List<FMNavigationListItem> ChildItems; 
    } 

    /// <summary> 
    /// Used internally by the adapter. 
    /// </summary> 
    internal class SectionedHeaderListItem 
    { 
     public string HeaderTitle; 
     public FMNavigationListItem Item; 

     public SectionedHeaderListItem(string headerTitle, FMNavigationListItem item) 
     { 
      HeaderTitle = headerTitle; 
      Item = item; 
     } 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    class SectionedHeaderListViewAdaper : BaseAdapter 
    { 
     const int TypeItem = 0; 
     const int TypeSeperator = 1; 

     LayoutInflater mLayoutInflater; 
     List<SectionedHeaderListItem> mDataItems; 
     List<int> mSectionPositions; 

     /// <summary> 
     /// 
     /// </summary> 
     /// <param name="context"></param> 
     /// <param name="items"></param> 
     public SectionedHeaderListViewAdaper(Context context, List<ExpandableItem> items) 
     { 
      mLayoutInflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService); 
      mSectionPositions = new List<int>(); 

      // Sort each item via header title. 
      List<ExpandableItem> dataItems = items; 
      dataItems.Sort(delegate (ExpandableItem e1, ExpandableItem e2) 
      { 
       return e1.HeaderTitle.CompareTo(e2.HeaderTitle); 
      }); 

      // Sort each child item alphabetically. 
      foreach (var d in dataItems) 
      { 
       d.ChildItems.Sort(delegate (FMNavigationListItem i1, FMNavigationListItem i2) 
       { 
        return i1.DisplayAttributes[0].CompareTo(i2.DisplayAttributes[0]); 
       }); 
      } 

      // Merge all items into one big list. 
      mDataItems = new List<SectionedHeaderListItem>(); 
      int index = 0; 
      foreach (var expandableItem in dataItems) 
      { 
       // Represents a section 
       mDataItems.Add(new SectionedHeaderListItem(
        expandableItem.HeaderTitle, 
        null)); 
       mSectionPositions.Add(index); 
       index++; 

       // Now add the child items for the section 
       foreach (var dataItem in expandableItem.ChildItems) 
       { 
        mDataItems.Add(new SectionedHeaderListItem(
         expandableItem.HeaderTitle, 
         dataItem)); 
        index++; 
       } 
      } 
     } 

     public override Java.Lang.Object GetItem(int position) 
     { 
      return position; 
     } 

     public override long GetItemId(int position) 
     { 
      return position; 
     } 

     public FMNavigationListItem ItemAt(int position) 
     { 
      return mDataItems[position].Item; 
     } 

     /// <summary> 
     /// One view for the header and another for 
     /// the normal cells. 
     /// </summary> 
     public override int ViewTypeCount 
     { 
      get 
      { 
       return 2; 
      } 
     } 

     public override int GetItemViewType(int position) 
     { 
      if (mSectionPositions.Contains(position)) 
       return TypeSeperator; 
      return TypeItem; 
     } 

     public override int Count 
     { 
      get 
      { 
       return mDataItems.Count; 
      } 
     } 

     public override View GetView(int position, View convertView, ViewGroup parent) 
     { 
      SectionedHeaderListViewAdaperViewHolder holder = null; 
      int rowType = GetItemViewType(position); 

      // Inflate the correct layout 
      if (convertView == null) 
      { 
       holder = new SectionedHeaderListViewAdaperViewHolder(); 
       switch(rowType) 
       { 
        case TypeItem: 
         convertView = mLayoutInflater.Inflate(
          Resource.Layout.adapter_expandable_listview_listitem, 
          null); 
         break; 
        case TypeSeperator: 
         convertView = mLayoutInflater.Inflate(
          Resource.Layout.adapter_expandable_listview_header, 
          null); 
         break; 
       } 
       convertView.Tag = (SectionedHeaderListViewAdaperViewHolder)convertView.Tag; 
      } 
      else 
      { 
       holder = (SectionedHeaderListViewAdaperViewHolder)convertView.Tag; 
      } 

      //Populate UI components 
      SectionedHeaderListItem item = mDataItems[position]; 
      switch (rowType) 
      { 
       case TypeItem: 
        // Horrible code incomming 
        holder.DispAttsTextViews = new List<TextView>(); 
        holder.DispAttsTextViews.Add(convertView.FindViewById<TextView>(Resource.Id.adapter_expandable_listview_listitem_textview1)); 
        holder.DispAttsTextViews.Add(convertView.FindViewById<TextView>(Resource.Id.adapter_expandable_listview_listitem_textview2)); 
        holder.DispAttsTextViews.Add(convertView.FindViewById<TextView>(Resource.Id.adapter_expandable_listview_listitem_textview3)); 
        holder.DispAttsTextViews[0].Text = item.Item.DisplayAttributes[0]; 
        holder.DispAttsTextViews[1].Text = item.Item.DisplayAttributes[1]; 
        holder.DispAttsTextViews[2].Text = item.Item.DisplayAttributes[2]; 
        break; 
       case TypeSeperator: 
        holder.HeaderTextView = convertView.FindViewById<TextView>(Resource.Id.adapter_expandable_listview_header_textview); 
        holder.HeaderTextView.Text = item.HeaderTitle; 
        break; 
      } 
      return convertView; 
     } 
    } 

    class SectionedHeaderListViewAdaperViewHolder : Java.Lang.Object 
    { 
     public TextView HeaderTextView { get; set; } 
     public List<TextView> DispAttsTextViews { get; set; } 
    } 

Sie können das Objekt FMNavigationListItem ändern, da dies intern als Datenelement verwendet wird. Die Idee dahinter ist, die Daten in ExpandableItem Objekte zu gruppieren, die jeweils einen Kopftitel haben. Der Adapter nimmt diese Objekte und führt sie zu einer großen Liste zusammen.

können Sie das Ergebnis sehen here

Verwandte Themen