Lorsque j'ai reçu des images du serveur, certains restaurants ont respectivement 1 menu, 4 menus, 5 menus, etc. Donc, j'utilise try catch pour IndexOutOfBoundsException mais si le restaurant a 1 menu, il n'affiche pas d'autres données (par exemple, l'emplacement) en dessous du menu. Par exemple. la première disposition linéaire est le menu, la deuxième disposition linéaire est l'emplacement, etc. Si le restaurant a 4 menus, l'emplacement s'affiche. Lorsque je dirige le restaurant, j'ai 1 menu, java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1

Au restaurant,

    "id": "1",
    "menus_count": 1,
    "menus": [
      {
        "id": 27,
        "menuImage": "e90573d2662eaa8d35b35c9cfcde2ee0.jpg"
      }
    ],

Dans un autre restaurant,

    "id": "2",
    "menus_count": 5,
    "menus": [
      {
        "id": 22,
        "menuImage": "ee7e8f69f24dbba3c65d043192466be0.jpg"
      },
      {
        "id": 20,
        "menuImage": "64eaeb5c50f38c94ea65fe7e412047be.jpg"
      },
      {
        "id": 12,
        "menuImage": "5fc3b5f41a49da0281ee3f970cb64d26.jpg"
      },
      {
        "id": 9,
        "menuImage": "e56fa9fcbdeec32a94216e080de35952.jpg"
      }
    ],

Restaurant Activity.java

try {
    if (restaurant.getMenus() != null && restaurant.getMenus().size() > 0) {
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(0).getMenuImage()).into(img_menu_zero);
        linearlayout_menu_zero.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(1).getMenuImage()).into(img_menu_one);
        linearlayout_menu_one.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(2).getMenuImage()).into(img_menu_two);
        linearlayout_menu_two.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(3).getMenuImage()).into(img_menu_three);
        linearlayout_menu_three.setVisibility(View.VISIBLE);
    }
    txt_locality_township.setText(restaurant.getLocality() + ", " + restaurant.getTownshipName());
} catch (NullPointerException | IndexOutOfBoundsException e) {
    e.printStackTrace();
}

En verbeux,

04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at java.util.ArrayList.get(ArrayList.java:308)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at com.wpg.hungryhopper.RestaurantActivity$1.success(RestaurantActivity.java:219)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at com.wpg.hungryhopper.RestaurantActivity$1.success(RestaurantActivity.java:150)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at android.os.Looper.loop(Looper.java:135)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5669)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
04-26 10:08:38.896 26119-26119/com.eg.restaurant W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
1
Tr. Buu 26 avril 2017 à 06:34

3 réponses

Meilleure réponse

Le problème est dans votre logique, même si vous avez 1 entrée pour le menu dans la liste que vous appelez toujours

restaurant.getMenus().get(2)

Cela donnera une exception de tableau hors limites

if (restaurant.getMenus() != null && restaurant.getMenus().size() > 0) {
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(0).getMenuImage()).into(img_menu_zero);
        linearlayout_menu_zero.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(1).getMenuImage()).into(img_menu_one);
        linearlayout_menu_one.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(2).getMenuImage()).into(img_menu_two);
        linearlayout_menu_two.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(3).getMenuImage()).into(img_menu_three);
        linearlayout_menu_three.setVisibility(View.VISIBLE);
    }

Devrait être

if (restaurant.getMenus() != null && restaurant.getMenus().size() > 0) {
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(0).getMenuImage()).into(img_menu_zero);
        linearlayout_menu_zero.setVisibility(View.VISIBLE);
        if(restaurant.getMenus().size()>=2){
        Picasso.with(context).load("http://ex}{ample.com/uploads/menus/" + restaurant.getMenus().get(1).getMenuImage()).into(img_menu_one);
        linearlayout_menu_one.setVisibility(View.VISIBLE);}
if(restaurant.getMenus().size()>=3){
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(2).getMenuImage()).into(img_menu_two);
        linearlayout_menu_two.setVisibility(View.VISIBLE);}
if(restaurant.getMenus().size()>=4){
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(3).getMenuImage()).into(img_menu_three);
        linearlayout_menu_three.setVisibility(View.VISIBLE);}

    }

Le code que j'ai écrit ici est très mauvais, mais mes intentions sont de vous montrer comment résoudre ce problème et pourquoi cette exception dans votre code, vous pouvez également essayer de rendre ImageViews dynamiquement dans votre mise en page linéaire pour améliorer ce code et cela fournira vous avec la possibilité d'augmenter le nombre d'images même s'il y a 100 pages de menu sans changer de code et avoir des pages de menu statiques dans les mises en page.

1
Ankit Arora 26 avril 2017 à 04:18

Ma suggestion est d'utiliser RecyclerView pour renseigner list au lieu d'utiliser plusieurs LinearLayout. Parce que vos éléments de menu sont dynamiques. Ainsi, vous pouvez le gérer en utilisant RecyclerView. Si vous publiez la capture d'écran, je pourrais peut-être vous donner la solution appropriée.

1
Kaushik 26 avril 2017 à 04:33

Placez simplement la ligne qui met à jour l'emplacement en haut du bloc if.

txt_locality_township.setText (restaurant.getLocality () + "," + restaurant.getTownshipName ());

La raison pour laquelle l'emplacement n'est pas mis à jour est que si IndexOutOfBoundsException est levée, il ignore ce code afin que l'emplacement ne soit pas mis à jour.

try {
    txt_locality_township.setText(restaurant.getLocality() + ", " + restaurant.getTownshipName());
    if (restaurant.getMenus() != null && restaurant.getMenus().size() > 0) {
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(0).getMenuImage()).into(img_menu_zero);
        linearlayout_menu_zero.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(1).getMenuImage()).into(img_menu_one);
        linearlayout_menu_one.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(2).getMenuImage()).into(img_menu_two);
        linearlayout_menu_two.setVisibility(View.VISIBLE);
        Picasso.with(context).load("http://example.com/uploads/menus/" + restaurant.getMenus().get(3).getMenuImage()).into(img_menu_three);
        linearlayout_menu_three.setVisibility(View.VISIBLE);
    }

} catch (NullPointerException | IndexOutOfBoundsException e) {
    e.printStackTrace();
}
1
Ahsan Iqbal 26 avril 2017 à 06:25