【问题标题】:Xamarin.Android ListView in DialogFragment is not DisplayedDialogFragment 中的 Xamarin.Android ListView 不显示
【发布时间】:2017-03-06 09:54:46
【问题描述】:

我尝试在对话框片段中创建一个带有自定义适配器的列表视图。问题是 Listview 没有显示在片段中。如果我将视图放入主活动中,则会显示列表 + 其项目。也许有人知道我的代码有什么问题:

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 是空白的。调试显示项目在列表中。

【问题讨论】:

    标签: c# android listview android-fragments xamarin


    【解决方案1】:

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

    正如@apineda 提到的,您的DialogFragment 背景是白色的,您没有在适配器中实现GetView,但是由于您可以运行代码,我想您已经完成了这项工作。不要张贴。

    使用非常基本的列表视图项布局进行测试:

    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提到的,通常我们在GetItemId中返回position

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

    此外,我认为您可能希望将List&lt;string&gt; 从您的MainActivity 传递给您的DialogFragment,然后我们可以例如这样的代码:

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

    在 Dialog 的 OnCreate 方法中:

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

    【讨论】:

      【解决方案2】:

      我发现您发布的代码存在一些问题:

      Count() 不存在,因为这不是 List 的方法

      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 上的默认文本颜色是白色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-10
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        相关资源
        最近更新 更多