我正在使用 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;
}
}
看来 GridView 无法按我的预期工作。 它不会随着提供的内容一起增长,它定义了它将根据其拥有的空间显示/加载多少内容。(如果在 GridView 文档中说明这一点就更好了)
由于这对于我的要求不可行,因此我将使用 GridLayout 并在其中添加内容元素视图。
不要使用 if (view == null) 总是让它成为新的
var item = _tileList[position];
view = _context.LayoutInflater.Inflate(Resource.Layout.BasicVehicleCard, null);
view.FindViewById<TextView>(Resource.Id.vehicleName).Text = item.Name;