C# DialogFragment中的Xamarin.Android ListView不显示
我试图在对话框片段中创建一个带有自定义适配器的listview。问题是Listview没有显示在片段中。如果我将视图放置到主活动中,将显示列表及其项目。也许有人知道我的代码有什么问题:C# DialogFragment中的Xamarin.Android ListView不显示,c#,android,listview,android-fragments,xamarin,C#,Android,Listview,Android Fragments,Xamarin,我试图在对话框片段中创建一个带有自定义适配器的listview。问题是Listview没有显示在片段中。如果我将视图放置到主活动中,将显示列表及其项目。也许有人知道我的代码有什么问题: MainActivity class public class MainActivity : Activity { private List<string> serialNumbers = new List<string> { "test1", "test2" }; pr
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);
}
}
main活动类
公共课活动:活动
{
私有列表serialNumbers=新列表{“test1”、“test2”};
private SerialDialog dialog=新建SerialDialog();
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
显示(FragmentManager,“SerialDialog”);
}
}
串行对话类
类SerialDialog:DialogFragment
{
私有视图=空;
私有列表serialNumbers=新列表{“test”};
私有列表视图列表视图;
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
base.OnCreateView(充气机、容器、保存状态);
视图=充气机。充气(Resource.Layout.EnterSerial,container,false);
listView=view.FindViewById(Resource.Id.SerialListView);
Adapter=新的CustomAdapter(活动,序列号);
返回视图;
}
已创建ActivityState(Bundle savedInstanceState)上的公共覆盖无效
{
Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
创建的基本活动(savedInstanceState);
}
}
自定义适配器类
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;
}
}
公共类CustomAdapter:BaseAdapter
{
私有列表项=新列表();
私人活动语境;
公共重写字符串此[int位置]
{
收到
{
退货项目[位置];
}
}
公共覆盖整数计数
{
收到
{
returnitems.Count();
}
}
公共CustomAdapter(活动上下文,列表项):base()
{
this.context=上下文;
这个项目=项目;
}
公共无效添加(字符串项)
{
项目。添加(项目);
NotifyDataSetChanged();
}
公共覆盖长GetItemId(int位置)
{
返回0;
}
公共覆盖视图GetView(int位置、视图转换视图、视图组父视图)
{
返回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,因为以后需要添加元素。对话框片段为空。调试显示项目在列表中。我发现您发布的代码存在一些问题: Count()不存在,因为这不是列表的方法
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);
}
另外,请记住将显示数据的文本视图的颜色设置为对话框碎片上的默认文本颜色为白色
对话框片段为空。调试显示项目在列表中
正如@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;
}
此外,我认为您可能希望将列表
从您的main活动
传递到您的对话框片段
,然后我们可以执行如下示例代码:
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();
}
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
var args = Arguments;
serialNumbers = args.GetStringArrayList("list").ToList();
}