Je veux poser une question sur le fragment et le modèle de vue. Je crée un gridView qui peut afficher des images avec retrofit (tiroir de navigation). Lorsque vous utilisez mainActivity, il n'y a aucun problème, mais lorsque vous utilisez des fragments, il y a une erreur comme ci-dessous.
2020-01-02 15:26:12.401 2455-2455/com.example.bpskotayogyakarta A/zygote: thread.cc:2090] No pending exception expected: java.lang.ArrayIndexOutOfBoundsException: length=6; index=6 2020-01-02 15:26:12.491 2455-2455/com.example.bpskotayogyakarta A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 2455 (skotayogyakarta), pid 2455 (skotayogyakarta)
Lorsque j'essaye d'exécuter et d'ouvrir ce fragment, cela entraîne un plantage et une erreur p>
public class InfografisFragment extends Fragment { private InfografisViewModel infografisViewModel; private List<Spacecraft> spacecraftList; private GridViewAdapter adapter; private GridView gridView; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { infografisViewModel = ViewModelProviders.of(this).get(InfografisViewModel.class); View root = inflater.inflate(R.layout.fragment_infografis, container, false); return root; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); MyAPIService myAPIService = RetrofitClientInstance.getRetrofitInstance().create(MyAPIService.class); gridView = getView().findViewById(R.id.grid_view); Call<List<Spacecraft>> call = myAPIService.getSpacecrafts(); call.enqueue(new Callback<List<Spacecraft>>() { @Override public void onResponse(Call<List<Spacecraft>> call, Response<List<Spacecraft>> response) { spacecraftList = response.body(); adapter = new GridViewAdapter(getContext(), spacecraftList); gridView.setAdapter(adapter); } @Override public void onFailure(Call<List<Spacecraft>> call, Throwable throwable) { Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_LONG).show(); } }); } class Spacecraft { /* INSTANCE FIELDS */ @SerializedName("gambar_info") private String gambar_info; public Spacecraft(int id_info, String gambar_info) { this.gambar_info = gambar_info; } /* *GETTERS AND SETTERS */ public String getImageURL() { return gambar_info; } } interface MyAPIService { @GET("connection_image_bps.php") Call<List<Spacecraft>> getSpacecrafts(); } static class RetrofitClientInstance { private static Retrofit retrofit; private static final String BASE_URL = "https://bpskotayogyakarta.000webhostapp.com/"; public static Retrofit getRetrofitInstance() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); } return retrofit; } } class GridViewAdapter extends BaseAdapter { private List<Spacecraft> spacecrafts; private Context context; public GridViewAdapter(Context context,List<Spacecraft> spacecrafts){ this.context = context; this.spacecrafts = spacecrafts; } @Override public int getCount() { return spacecrafts.size(); } @Override public Object getItem(int pos) { return spacecrafts.get(pos); } @Override public long getItemId(int pos) { return pos; } @Override public View getView(int position, View view, ViewGroup viewGroup) { if(view==null) { view=LayoutInflater.from(context).inflate(R.layout.list_gambar_info,viewGroup,false); } ImageView spacecraftImageView = view.findViewById(R.id.image_view); final Spacecraft thisSpacecraft= spacecrafts.get(position); if(thisSpacecraft.getImageURL() != null && thisSpacecraft.getImageURL().length()>0) { Picasso.get().load(thisSpacecraft.getImageURL()).placeholder(R.drawable.placeholder).into(spacecraftImageView); }else { Toast.makeText(context, "Empty Image URL", Toast.LENGTH_LONG).show(); Picasso.get().load(R.drawable.placeholder).into(spacecraftImageView); } return view; } }
Et le reste du débogage https://justpaste.it/2rv1v
Et le fichier PHP de l'API https://justpaste.it/4pdp8
J'ai essayé maintes et maintes fois, des recherches sur google mais je ne comprends toujours pas. Que dois-je faire?
3 Réponses :
Essayez de passer null dans getItem () et 0 dans getItemId ()
@Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; }
Nous ne pouvons pas passer null
dans getItem ()
. Cette méthode serait appelée lorsque l'utilisateur fait défiler vers le bas, et en fonction de la valeur de retour de getItem ()
, de nouvelles lignes seraient ajoutées
Modifiez votre code dans GridViewAdapter de la manière suivante:
public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; }
Ce qui précède devrait résoudre votre problème.
Aussi, sur votre méthode onViewCreated, pourquoi utilisez-vous getView ()? Lorsque la vue est déjà appelée dans votre constructeur en tant que vue vue.
Vous pouvez utiliser gridView = view.findViewById (R.id.grid_view);
à la place. Je suppose que c'est une meilleure façon de coder.
J'ai trouvé une solution en modifiant la mise en page de relative à cardview et en ajoutant compabilityOption dans build.gradle.
compileOptions{ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
Pouvez-vous également publier votre réponse cloud que vous stockez dans la
liste des vaisseaux spatiaux
?@Kushal bpskotayogyakarta.000webhostapp.com/connection_image_bps.php
L'erreur est assez simple, vous essayez d'accéder à la position 6 dans une liste qui ne contient que des éléments jusqu'à la position 5. Déboguez votre code et découvrez où. De plus, le staketrace que vous avez publié est limité et ne nous dit pas où l'erreur se produit
@Ricardo voici le reste du débogage justpaste.it/2rv1v
@chrisrobet: Pouvez-vous publier la classe
GsonConverterFactory
? Je soupçonne un problème là-basFichier php @Kushal pour json justpaste.it/4pdp8