-1

J'essaie d'imprimer une réponse réponse json dans un recyclerview. mon Recyclerview est comme une liste agrandie. Et mon JSON resone est comme ceci:Réponse JSON Utilisation de Volley dans une vue recycleur dans l'application Android

{"Table1": 
[ 
{"filedate":"Oct 26, 2016"}, 
{"filedate":"Oct 18, 2016"} 
], 

"Table2": 
[{ 
"filedate":"Oct 18, 2016", 
"file1":"12.txt" 
}, 

{ 
"filedate":"Oct 26, 2016", 
"file1":"acerinvoice.pdf" 
} 
]} 

et j'essaie d'imprimer cette resonse JSON en utilisant ce code:

private void prepareListData() { 

     // Volley's json array request object 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL, 
       new Response.Listener<String>() { 

       //I think problrm is here 
        @Override 
        public void onResponse(String response) { 

         try { 

          **JSONObject object = new JSONObject(response); 

          JSONArray jsonarray = object.getJSONArray("Table1"); 
          JSONArray jsonarray1 = object.getJSONArray("Table2"); 
          for (int i = 0; i < jsonarray.length(); i++) { 
           try { 

            JSONObject obj = jsonarray.getJSONObject(i); 

            String str = obj.optString("filedate").trim(); 

            int lth = jsonarray1.length(); 


            data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.HEADER, str)); 
           for (int j = 0; j < jsonarray1.length(); j++) { 
             try { 

              JSONObject obj1 = jsonarray1.getJSONObject(j); 
              String str1 = obj1.optString("filedate").trim(); 

               data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, str1)); 
               Toast.makeText(getApplicationContext(), str1, Toast.LENGTH_LONG).show();** 

              //if condition 


             } catch (JSONException e) { 
//           Log.e(TAG, "JSON Parsing error: " + e.getMessage()); 
             } 

            } 

            // adding movie to movies array 



           } catch (JSONException e) { 
            Log.e("gdshfsjkg", "JSON Parsing error: " + e.getMessage()); 
           } 

          } 
          Log.d("test", String.valueOf(data)); 
          Toast.makeText(getApplicationContext(), (CharSequence) data, Toast.LENGTH_LONG).show(); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

         // notifying list adapter about data changes 
         // so that it renders the list view with updated data 

         recyclerview.setAdapter(new ExpandableListAdapter(data)); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }){ 
      @Override 
      protected Map<String, String> getParams() { 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put(CLIENT, "4"); 
       return params; 
      } 
     }; 
     // Adding request to request queue 
     MyApplication.getInstance().addToRequestQueue(stringRequest); 
    } 

ExpandableListAdapter

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    public static final int HEADER = 0; 
    public static final int CHILD = 1; 

    private List<Item> data; 

    public ExpandableListAdapter(List<Item> data) { 
     this.data = data; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { 
     View view = null; 
     Context context = parent.getContext(); 
     float dp = context.getResources().getDisplayMetrics().density; 
     int subItemPaddingLeft = (int) (18 * dp); 
     int subItemPaddingTopAndBottom = (int) (5 * dp); 
     switch (type) { 
      case HEADER: 
       LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = inflater.inflate(R.layout.list_header, parent, false); 
       ListHeaderViewHolder header = new ListHeaderViewHolder(view); 
       return header; 
      case CHILD: 
       TextView itemTextView = new TextView(context); 
       itemTextView.setPadding(subItemPaddingLeft, subItemPaddingTopAndBottom, 0, subItemPaddingTopAndBottom); 
       itemTextView.setTextColor(0x88000000); 
       itemTextView.setLayoutParams(
         new ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT, 
           ViewGroup.LayoutParams.WRAP_CONTENT)); 
       return new RecyclerView.ViewHolder(itemTextView) { 
       }; 
     } 
     return null; 
    } 

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     final Item item = data.get(position); 
     switch (item.type) { 
      case HEADER: 
       final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder; 
       itemController.refferalItem = item; 
       itemController.header_title.setText(item.text); 
       if (item.invisibleChildren == null) { 
        itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus); 
       } else { 
        itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus); 
       } 
       itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if (item.invisibleChildren == null) { 
          item.invisibleChildren = new ArrayList<Item>(); 
          int count = 0; 
          int pos = data.indexOf(itemController.refferalItem); 
          while (data.size() > pos + 1 && data.get(pos + 1).type == CHILD) { 
           item.invisibleChildren.add(data.remove(pos + 1)); 
           count++; 
          } 
          notifyItemRangeRemoved(pos + 1, count); 
          itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus); 
         } else { 
          int pos = data.indexOf(itemController.refferalItem); 
          int index = pos + 1; 
          for (Item i : item.invisibleChildren) { 
           data.add(index, i); 
           index++; 
          } 
          notifyItemRangeInserted(pos + 1, index - pos - 1); 
          itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus); 
          item.invisibleChildren = null; 
         } 
        } 
       }); 
       break; 
      case CHILD: 
       TextView itemTextView = (TextView) holder.itemView; 
       itemTextView.setText(data.get(position).text); 
       break; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return data.get(position).type; 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    private static class ListHeaderViewHolder extends RecyclerView.ViewHolder { 
     public TextView header_title; 
     public ImageView btn_expand_toggle; 
     public Item refferalItem; 

     public ListHeaderViewHolder(View itemView) { 
      super(itemView); 
      header_title = (TextView) itemView.findViewById(R.id.header_title); 
      btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle); 
     } 
    } 

    public static class Item { 
     public int type; 
     public String text; 
     public List<Item> invisibleChildren; 

     public Item() { 
     } 

     public Item(int type, String text) { 
      this.type = type; 
      this.text = text; 
     } 
    } 
} 

Mais rien d'impression de code dans mon recycleur UI.Il montre seulement une disposition vide.J'ai également essayé d'imprimer la réponse dans mon journal et il imprime toute la réponse ensemble. Je veux imprimer le contenu de la table1 dans les en-têtes et le contenu table2 en tant qu'enfants (articles) avec leurs en-têtes respectifs .Si vous avez d'autres informations, veuillez demander ..

+0

t-il imprimer quelque chose dans stacktrace en logcat? Avez-vous essayé le débogage étape par étape? –

+0

Oui ... il imprime la réponse complète seulement .. – Adi

+0

Ci-dessous est le bon format json, s'il vous plaît utilisez ceci, il devrait fonctionner- {"Table1": [ {"filedate": "Oct 26, 2016"}, {"filedate": "18 oct. 2016"} ], "Table2": [{"filedate": "18 oct. 2016", "file1": "12.txt"}, {"filedate ":" Oct 26, 2016 "," file1 ":" acerinvoice.pdf "} ]} – Amit

Répondre

0

je résoudre mon problème de changer juste au-dessus du code comme celui-ci ..

 private void prepareListData() { 


     // Volley's json array request object 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 


         JSONObject object = null; 
         try { 
          object = new JSONObject(response); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

         JSONArray jsonarray = null; 
         JSONArray jsonarray1 = null; 
         try { 
          jsonarray = object.getJSONArray("Table1"); 
          jsonarray1 = object.getJSONArray("Table1"); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

         for (int i = 0; i < jsonarray.length(); i++) { 
          try { 

           JSONObject obj = jsonarray.getJSONObject(i); 
//        
           String str = obj.optString("filedate").trim(); 


           Log.d("test", str); 

           data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.HEADER, str)); 

//         Toast.makeText(getApplicationContext(), lth, Toast.LENGTH_LONG).show(); 

            for (int j = 0; j < jsonarray1.length(); j++) { 

             try { 

              JSONObject obj1 = jsonarray1.getJSONObject(j); 
              String str1 = obj1.optString("filedate").trim(); 
              String str3 = obj1.optString("category").trim(); 
              String str2 = obj1.optString("file1").trim(); 

              String str4 = obj1.optString("4").trim(); 
               Toast.makeText(getApplicationContext(), "server data respone", Toast.LENGTH_LONG).show(); 
               Toast.makeText(getApplicationContext(), "test"+str1, Toast.LENGTH_LONG).show(); 
              if (str == str1) { 
//            data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, str1)); 
               data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, str3)); 
               data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, str2)); 

              } 
               Toast.makeText(getApplicationContext(), str1, Toast.LENGTH_LONG).show(); 

              //if condition 


             } catch (JSONException e) { 
//           Log.e(TAG, "JSON Parsing error: " + e.getMessage()); 
             } 

            } 

           // adding movie to movies array 



          } catch (JSONException e) { 
           Log.e("gdshfsjkg", "JSON Parsing error: " + e.getMessage()); 
          } 

         } 
         Log.d("test", String.valueOf(data)); 




         // notifying list adapter about data changes 
         // so that it renders the list view with updated data 
//      adapterheader.notifyDataSetChanged(); 
         recyclerview.setAdapter(new ExpandableListAdapter(data)); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
//    VolleyLog.d(TAG, "Error: " + error.getMessage()); 
//    hidePDialog(); 

      } 
     }){ 
      @Override 
      protected Map<String, String> getParams() { 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put(CLIENT, "4"); 
       return params; 
      } 
     }; 
     // Adding request to request queue 
     MyApplication.getInstance().addToRequestQueue(stringRequest); 
    } 
0

veuillez vérifier votre réponse json ceci est invalide réponse json d'abord essayer de valider votre json formate après essayer de décoder et d'ajouter dans la vue recycleur.

+0

Je sais déjà que c'est un peu faux .. Et j'essaie aussi une autre chose. .Je veux savoir ce qui est correct .. – Adi

1

Vous devriez probablement vérifier votre réponse tout d'abord. Selon vos besoins, vous devez utiliser HashMap et ArrayList. Suivez les étapes suivantes:

1.Prenez un ArrayLsit et stockez les données enfant du 1er enchère et ainsi de suite avec l'index à partir de 0. 2.Storez les en-têtes dans HashMap comme clé.

ex: HashMap<String,ArrayList<Data>> hm; hm.put("your first heading string","related arraylist"); Ensuite, utilisez ExpandableListView pour organiser les éléments parents et enfants.

+0

Je l'ai fait pour la première fois peut-on en savoir plus explorer .. – Adi

+0

se référer à ce http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/ –

+0

J'ai mis à jour ma classe d'adaptateur en question .... j'espère qu'il est à peu près au sujet de même que U expliquent .. – Adi

0

Vérifiez votre réponse dans Logcat également l'exception. J'ai testé la réponse que vous avez fournie qui contient certains "," inutiles qui peuvent provoquer l'exception. enter image description here

+0

Ceci est juste un échantillon .. il y a une erreur de suyntax ..J'ai mis à jour ce..J'ai J'ai déjà reçu la réponse complète dans mon journal. – Adi

+0

Puis déboguez chaque ligne de votre code (la taille du tableau, le JSONObject ..etc).Essayez Log ou Déboguer .. espérons que vous découvrirez le problème. –

+0

le problème réside dans l'impression de la table 2 (c'est-à-dire de l'article enfant). Est-ce que U peut vous aider? – Adi