0
votes

Que devriez-vous mettre dans ce fragment ViewModel?

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?


6 commentaires

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à-bas


Fichier php @Kushal pour json justpaste.it/4pdp8


3 Réponses :


0
votes

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;
}


1 commentaires

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



0
votes

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.


0 commentaires

1
votes

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
}


0 commentaires