2017-07-21 19 views
0

私はKitKat(4.4 - API19)をターゲットにしたC#でXamarain Androidで開発しています。Android GridViewアダプタで間違った位置が使用される

を設定

だから、私はGridViewコントロールを使用してレンダリングしたかった車のリストを持っています。これはいくつかのタブ内にあるので、GridViewは最初に対応するタブをクリックすると作成されるフラグメント内に含まれます(コードはここには表示されません)。うまくいけば、GarageFragmentAdapterがビューを取得するときに問題が発生します。 フラグメントとアダプタは一度しか作成されていないので、複数のインスタンスが作業に衝突することはありません。私はレンダリングについての瞬間に、鐘や笛(スクロール反応やアイテム反応)を付けなかった。

問題

私の例では、私のリストが長い4つの項目であるので、私は、4台の車を持っています。アダプタへの最初の呼び出しでは位置0(ok)、2番目の呼び出しでは位置0(NOT OK)、3番目の呼び出しでは位置1(間違いなくok)、4番目の呼び出しは使用されません。視覚的な出力は、私が期待していたものではないが、2つのアイテムだけが表示されていますが、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

'GetView'の中に' position'パラメータを持つ 'Log.d'を追加します。何が見えますか? – pskink

+0

@pskink D/Position(1492):0、D/Position(1492):0、D/Position(1492):1 – TiGoRn

+0

これは 'var view = convertView;'の前に呼び出されますか? – pskink

答えて

0

私が期待するようGridViewのは動作しません表示されます。 提供されたコンテンツとともに成長することはなく、コンテンツのスペースに応じて表示/ロードされるコンテンツの量を定義します。(GridViewのドキュメントに記載されているといいと思います)

これは私の要件では実現できないため、私は代わりにGridLayoutを使用してコンテンツ要素ビューを追加します。

関連する問題