2017-03-06 74 views
0

我试图用对话框片段中的自定义适配器创建一个listview。问题是Listview没有显示在片段中。如果我将视图放入主要活动中,则会显示列表+其项目。莫比有人知道什么是错我的代码:Xamarin.Android的ListView在DialogFragment中没有显示

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类

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> 

我用了一个BaseAdapter,因为我需要在以后添加元素。 DialogFragment是空白的。调试显示这些项目在列表中。

回答

1

DialogFragment为空。调试显示这些项目在列表中。

正如@apineda提到的,您的DialogFragment背景是白色的,你没有在您的适配器实现GetView,但因为你可以运行的代码,我想你已经完成了这项工作只是没有发表它。

测试与ListView项非常基本的布局:

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

默认的文本的颜色也是白色的,所以该项目无法看到。您可以删除EnterSerial.axml中的颜色android:background="@android:color/background_light"或将文本颜色添加到您的列表视图项目以测试您的代码。

也有很少数的问题与您的代码,除了什么apineda提到的,通常我们返回positionGetItemId

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

另外,我想你可能希望从你的MainActivity通过List<string>DialogFragment,然后例如,我们可以像这样的代码:

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

在对话框的OnCreate方法:

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

谢谢,这解决了我的问题 –

0

我看到你发布的代码的几个问题:

计数()不存在,因为这不是列表

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

您还没有实现您GetView方法的方法适配器。

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

要解决你与列表中的空白移动适配器创建到OnViewCreated问题:

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

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

还记得颜色设置为将作为要显示你的数据的TextView DialogFragments上的默认文本颜色是白色的。