2017-03-06 5 views
0

Ich habe versucht, eine ListView mit einem benutzerdefinierten Adapter in einem Dialogfeld Fragment zu erstellen. Das Problem ist, dass die Listview nicht im Fragment angezeigt wird. Wenn ich die Ansicht in die Hauptaktivität platziere, werden die Liste + ihre Elemente angezeigt. Maby jemand weiß, was mit meinem Code falsch ist:Xamarin.Android ListView in DialogFragment wird nicht angezeigt

MainActivity class 

public class MainActivity : Activity 
{ 
    private List<string> serialNumbers = new List<string> { "test1", "test2" }; 
    private SerialDialog dialog = new SerialDialog(); 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.Main); 
     dialog.Show(FragmentManager, "SerialDialog"); 
    } 
} 

SerialDialog class 
class SerialDialog : DialogFragment 
{ 
    private View view = null; 
    private List<string> serialNumbers = new List<string> { "test" }; 
    private ListView listView; 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     base.OnCreateView(inflater, container, savedInstanceState); 
     view = inflater.Inflate(Resource.Layout.EnterSerial, container, false); 
     listView = view.FindViewById<ListView>(Resource.Id.SerialListView); 
     listView.Adapter = new CustomAdapter(Activity, serialNumbers); 

     return view; 
    } 

    public override void OnActivityCreated(Bundle savedInstanceState) 
    { 
     Dialog.Window.RequestFeature(WindowFeatures.NoTitle); 
     base.OnActivityCreated(savedInstanceState); 
    } 

} 

CustomAdapter Klasse

public class CustomAdapter : BaseAdapter<string> 
{ 
    private List<string> items = new List<string>(); 
    private Activity context; 
    public override string this[int position] 
    { 
     get 
     { 
      return items[position]; 
     } 
    } 
    public override int Count 
    { 
     get 
     { 
      return items.Count(); 
     } 
    } 

    public CustomAdapter(Activity context, List<string> items) : base() 
    { 
     this.context = context; 
     this.items = items; 
    } 
    public void Add(string item) 
    { 
     items.Add(item); 
     NotifyDataSetChanged(); 
    } 

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

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     return null; 
    } 
} 

EnterSerial.axml

<?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="fill_parent" 
    android:minWidth="25px" 
    android:minHeight="25px" 
    android:background="@android:color/background_light"> 
    <ListView 
     android:minWidth="25px" 
     android:minHeight="25px" 
     android:layout_width="match_parent" 
     android:layout_height="200.5dp" 
     android:id="@+id/SerialListView" 
     android:layout_marginBottom="0.0dp" /> 
</LinearLayout> 

benutzte ich ein BaseAdapter, weil ich später Elemente hinzufügen müssen. Das DialogFragment ist leer. Das Debugging zeigt, dass sich die Elemente in der Liste befinden.

Antwort

1

Das DialogFragment ist leer. Das Debugging zeigt, dass sich die Elemente in der Liste befinden.

Wie @apineda erwähnt, ist Ihr Hintergrund von DialogFragment ist weiß und Sie haben die GetView in Ihrem Adapter nicht implementieren, aber da Sie den Code ausführen kann, nehme ich an, dass Sie diese Arbeit einfach nicht getan haben veröffentliche es.

mit dem sehr grundlegenden Layout für Listenansicht Artikel Geprüft:

public override View GetView(int position, View convertView, ViewGroup parent) 
{ 
    View view = convertView; // re-use an existing view, if one is available 
    if (view == null) // otherwise create a new one 
     view = context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, null); 
    var tv = view.FindViewById<TextView>(Android.Resource.Id.Text1); 
    tv.Text = items[position]; 
    return view; 
} 

des Textes der Farbe ist auch weiß, standardmäßig, so dass die Elemente nicht gesehen werden können. Sie können entweder die Farbe android:background="@android:color/background_light" in Ihrem EnterSerial.axml entfernen oder Ihrem Listenansichtselement eine Textfarbe hinzufügen, um Ihren Code zu testen.

Auch sind da ein paar Problem mit Ihrem Code, außer dem, was apineda erwähnt, in der Regel kehren wir die position in GetItemId:

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

Darüber hinaus denke ich, Sie List<string> von Ihrem MainActivity passieren möchten Ihre DialogFragment, dann können wir zum Beispiel Code wie folgt:

FragmentTransaction ft = FragmentManager.BeginTransaction(); 
ft.AddToBackStack(null); 
Bundle args = new Bundle(); 
args.PutStringArrayList("list", serialNumbers); 
dialog.Arguments = args; 
dialog.Show(ft, "TAG"); 

im OnCreate Methode Ihrer Dialog:

public override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 
    var args = Arguments; 
    serialNumbers = args.GetStringArrayList("list").ToList(); 
} 
+0

danke, das hat mein Problem behoben –

0

Ich sehe ein paar Probleme mit dem Code, den Sie geschrieben:

Count() existiert nicht, da dies kein Verfahren für die Liste ist

public override int Count 
{ 
    get 
    { 
     return items.Count(); 
    } 
} 

Sie Ihre GetView Methode nicht bei der Umsetzung der Adapter.

public override View GetView(int position, View convertView, ViewGroup parent) 
{ 
    return null; 
} 

Um das Problem zu beheben Sie in leere Bewegung der Adapter Schöpfung auf die OnViewCreated mit der Liste haben:

public override void OnViewCreated (View view, Bundle savedInstanceState) 
{ 
    base.OnViewCreated (view, savedInstanceState); 

    listView.Adapter = new CustomAdapter (Activity, serialNumbers); 
} 

Denken Sie auch an die Farbe der Textview zu setzen, dass Ihre Daten wie die Anzeige wird Die Standardtextfarbe für DialogFragments ist weiß.

Verwandte Themen