我正在使用针对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;
}
}
答案 0 :(得分:0)
似乎 GridView 无法正常工作。 它不会随着提供的内容一起增长,它会定义显示/加载的内容量,具体取决于它所拥有的空间。(在GridView的文档中可以很好地说明这一点。 )
由于这对我的要求不可行,我将使用GridLayout并在其中添加内容元素视图。