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

时间:2017-07-21 06:49:24

标签: c# android xamarin gridview

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

设置

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

问题

在我的例子中,我有4辆车,所以我的列表有4个项目。第一次调用适配器使用位置0(ok),第二次调用也使用位置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;
    }
}

1 个答案:

答案 0 :(得分:0)

似乎 GridView 无法正常工作。 它不会随着提供的内容一起增长,它会定义显示/加载的内容量,具体取决于它所拥有的空间。(在GridView的文档中可以很好地说明这一点。 )

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