Android GridView 适配器使用错误的位置

问题描述 投票:0回答:2

我正在使用 Xamarain Android 在 C# 上针对 KitKat (4.4 - API19) 进行开发。

设置

所以我有一个想要使用 GridView 渲染的车辆列表。由于这是在某些选项卡中,因此 GridView 包含在首次单击相应选项卡时要创建的片段中(此处未显示代码)。这工作正常,当 GarageFragmentAdapter 开始获取视图时就会出现问题。 我确保片段和适配器仅创建一次,因此不存在多个实例与其工作发生冲突的问题。目前我还没有附加任何附加功能(滚动反应或项目反应),这只是渲染。

问题

在我的示例中,我有 4 辆车,所以我的列表有 4 项长。对适配器的第一次调用使用位置 0(正常),第二次调用也使用位置 0(不正常),然后只有第三次调用使用位置 1(绝对不正常)并且没有第四次调用。然后,视觉输出仅显示两个项目,这也不是我所期望的,但我认为 GridView 使用该位置在位置 x 处渲染项目。

所以我的问题是,如何说服适配器正确地迭代我的数据列表?

代码

下面看到的代码是最新的迭代,事先在片段中设置了适配器,我认为这是问题,因为在某处阅读这可能是一个问题。

public class GarageFragment : Fragment
{
    private readonly VehiclesResponse _garageResponse;
    private readonly GarageFragmentAdapter _adapter;

    public GarageFragment(VehiclesResponse garageResponse, GarageFragmentAdapter adapter)
    {
        _garageResponse = garageResponse;
        _adapter = adapter;
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var fragmentView = inflater.Inflate(Resource.Layout.fragment_garage, container, false);
        fragmentView.FindViewById<GridView>(Resource.Id.gridVehicleCards).Adapter = _adapter;
        fragmentView.FindViewById<Button>(Resource.Id.btnShowFullGarage).Visibility = _garageResponse.TotalCarsInGarageCount > 4 ? ViewStates.Visible : ViewStates.Gone;
        fragmentView.FindViewById<LinearLayout>(Resource.Id.boxAddVehicles).Visibility = _garageResponse.CanAddVehicles ? ViewStates.Visible : ViewStates.Gone;

        return fragmentView;
    }
}

public class GarageFragmentAdapter : BaseAdapter
{
    private readonly Activity _context;
    private readonly IList<Vehicle> _tileList;

    public GarageFragmentAdapter(Activity context, IList<Vehicle> vehicles)
    {
        _context = context;
        _tileList = vehicles;
    }

    public override int Count => _tileList.Count;

    public override Object GetItem(int position)
    {
        return null;
    }

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

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var view = convertView;
        if (view == null)
        {
            var item = _tileList[position];
            view = _context.LayoutInflater.Inflate(Resource.Layout.BasicVehicleCard, null);
            view.FindViewById<TextView>(Resource.Id.vehicleName).Text = item.Name;
        }

        return view;
    }
}
c# android xamarin gridview
2个回答
0
投票

看来 GridView 无法按我的预期工作。 它不会随着提供的内容一起增长,它定义了它将根据其拥有的空间显示/加载多少内容。(如果在 GridView 文档中说明这一点就更好了)

由于这对于我的要求不可行,因此我将使用 GridLayout 并在其中添加内容元素视图。


0
投票

不要使用 if (view == null) 总是让它成为新的

 var item = _tileList[position];
        view = _context.LayoutInflater.Inflate(Resource.Layout.BasicVehicleCard, null);
        view.FindViewById<TextView>(Resource.Id.vehicleName).Text = item.Name;
© www.soinside.com 2019 - 2024. All rights reserved.