11

Ich habe ein Array, das mit API-Daten gefüllt ist, und ich habe eine erweiterbare Listview, um die Elemente dieses Array anzuzeigen, was ich jetzt versuche, wenn der Benutzer klickt Bei einem Item speichert es die ID dieses Items in einem Array. Wenn der Benutzer also 2 Items auswählt, möchte ich 2 Ids in meinem Array haben. Was jetzt passiert, ist dies: Egal ob ich nur eines der Items auswähle, von denen es alles bekommt sie und speichern Sie es in meinem Array.ExpandableListView mit Multiple-Choice-Speichern ausgewählter Artikel in ein Array

public class MainActivity extends Fragment { 

    private ExpandListAdapter ExpAdapter; 
    private ExpandableListView ExpandList; 
    private Button notificar; 
    private Context context; 
    MainActivity mContext; 
    private Button footer; 
    private double RaioEscola; 
    private CircleOptions mCircle; 
    GPSTracker tracker; 
    private Location location; 
    private Integer IdEscola; 

    public MainActivity() { 
    } 

    public MainActivity(Context context) { 
     this.context = context; 
    } 

    @Override 
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     final View rootView = inflater.inflate(R.layout.expand, container, false); 

     ExpandList = (ExpandableListView) rootView.findViewById(R.id.exp_list); 
     notificar = (Button) rootView.findViewById(R.id.btnGetMoreResults); 

     new asyncTask(MainActivity.this).execute(); 

     return rootView; 
    } 

    private class asyncTask extends AsyncTask<String, Void, Void> { 

     private ProgressDialog pd; 

     public asyncTask(MainActivity context) { 

      mContext = context; 
      pd = new ProgressDialog(getActivity()); 
      pd.setTitle("Por Favor Espere ..."); 
      pd.setMessage("Enviando ..."); 
      if (!pd.isShowing()) { 
       pd.show(); 
      } 
     } 


     @Override 
     protected Void doInBackground(final String... params) { 

      try { 

       String[] resposta = new WebService().get("filhos"); 

       if (resposta[0].equals("200")) { 

        JSONObject mJSONObject = new JSONObject(resposta[1]); 
        JSONArray dados = mJSONObject.getJSONArray("data"); 

        /* cria o array que vai receber os dados da api */ 
        final ArrayList<Escolas> mArrayList = new ArrayList<Escolas>(); 

        /* percorre o array, adicionando cada linha encontrada em um ArrayList */ 
        for (int i = 0; i < dados.length(); i++) { 

         JSONObject item = dados.getJSONObject(i); 

         Escolas mEscolas = new Escolas(); 

         mEscolas.setId_escola(item.optInt("id_escola")); 
         mEscolas.setCnpj(item.getString("cnpj")); 
         mEscolas.setRazao_social(item.getString("razao_social")); 
         mEscolas.setNome_fantasia(item.getString("nome_fantasia")); 
         mEscolas.setDistancia(Float.valueOf(item.getString("distancia"))); 
         mEscolas.setLogradouro(item.optString("logradouro")); 
         mEscolas.setNumero(item.optString("numero")); 
         mEscolas.setBairro(item.getString("bairro")); 
         mEscolas.setComplemento(item.getString("complemento")); 
         mEscolas.setCep(item.getString("cep")); 
         mEscolas.setCidade(item.getString("cidade")); 
         mEscolas.setEstado(item.getString("estado")); 
         mEscolas.setLatitude(Float.parseFloat(item.getString("latitude"))); 
         mEscolas.setLongitude(Float.parseFloat(item.getString("longitude"))); 

         RaioEscola = Double.parseDouble(String.valueOf(mEscolas.getDistancia())); 
         IdEscola = mEscolas.getId_escola(); 


         JSONObject alunos = item.optJSONObject("alunos"); 

         JSONArray data = alunos.getJSONArray("data"); 

         if (data != null) { 

          ArrayList<Filhos> arrayalunos = new ArrayList<Filhos>(); 

          for (int a = 0; a < data.length(); a++) { 

           Filhos mFilhos = new Filhos(); 

           JSONObject clientes = data.getJSONObject(a); 

           mFilhos.setId_aluno(clientes.optInt("id_aluno")); 
           mFilhos.setNome(clientes.optString("nome")); 
           mFilhos.setSobrenome(clientes.optString("sobrenome")); 
           mFilhos.setFoto(clientes.optString("foto")); 
           mFilhos.setModalidade_de_ensino(clientes.optString("modalidade_de_ensino")); 
           mFilhos.setObservacoes(clientes.optString("observacoes")); 

           arrayalunos.add(mFilhos); 
          } 

          mEscolas.setalunos(arrayalunos); 
         } 

         /* popula o array de viagens */ 
         mArrayList.add(mEscolas); 

         ExpAdapter = new ExpandListAdapter(getActivity(), mArrayList); 

         getActivity().runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 

           ExpandList.setAdapter(ExpAdapter); 
           ExpAdapter.notifyDataSetChanged(); 

           ExpAdapter.setChoiceMode(ExpandListAdapter.CHOICE_MODE_MULTIPLE); 

           ExpandList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 

            @Override 
            public boolean onChildClick(final ExpandableListView parent, View v, final int groupPosition, final int childPosition, final long id) { 

             ExpAdapter.setClicked(groupPosition, childPosition); 
             final int index = parent.getFlatListPosition(ExpandableListView.getPackedPositionForChild(groupPosition, childPosition)); 
             parent.setItemChecked(index, true); 
             parent.setSelectedChild(groupPosition, childPosition, true); 
             parent.getChildAt(index); 

             notificar.setOnClickListener(new View.OnClickListener() { 

              @Override 
              public void onClick(View v) { 

               class update extends TimerTask { 

                public void run() { 

                 try { 

                  getActivity().runOnUiThread(new Runnable() { 

                   @Override 
                   public void run() { 

                    final float latitude = mArrayList.get(groupPosition).getLatitude(); 
                    final float longitude = mArrayList.get(groupPosition).getLongitude(); 

                    LatLng latLng = new LatLng(latitude, longitude); 
                    drawMarkerWithCircle(latLng); 

                    GPSTracker gps = new GPSTracker(getActivity()); 

                    double latitudegps = gps.getLatitude(); 
                    double longitudegps = gps.getLongitude(); 

                    float[] distance = new float[2]; 

                    Location.distanceBetween(mCircle.getCenter().latitude, mCircle.getCenter().longitude, latitudegps, longitudegps, distance); 
                    if (distance[0] > mCircle.getRadius()) { 
                     Toast.makeText(getActivity(), "Outside", Toast.LENGTH_LONG).show(); 
                    } 
                    else { 
                     Toast.makeText(getActivity(), "Inside", Toast.LENGTH_LONG).show(); 
                     AlertRest mAlertRest = new AlertRest(); 
                     try { 

                      List<Integer> myIdList = new ArrayList<Integer>(); 

                      for (int i = 0; i < mArrayList.get(groupPosition).getalunos().size(); i++) { 

                       Integer Idalunos = mArrayList.get(groupPosition).getalunos().get(i).getId_aluno(); 

                       myIdList.add(Idalunos); 
                      } 

                      mAlertRest.getNotificacao(1, mArrayList.get(groupPosition).getId_escola(), String.valueOf(myIdList), latitudegps, longitudegps); 

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

               Timer timer = new Timer(); 
               timer.schedule(new update(), 0, 15000); 
              } 

              private void drawMarkerWithCircle(LatLng position) { 
               mCircle = new CircleOptions().center(position).radius(RaioEscola); 
              } 
             }); 

             return false; 
            } 
           }); 
          } 
         }); 
        } 

        /* retorna um array de objetos */ 

       } 
       else { 
        throw new Exception("[" + resposta[0] + "] ERRO: " + resposta[1]); 
       } 

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

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void cursor) { 
      if (pd.isShowing()) { 
       pd.dismiss(); 
      } 
     } 
    } 
} 

AlertRest:

public class AlertRest extends WebService { 


    private String recurso = "notificacoes"; 
    private String[] resposta; 
    private AlertModelo mAlertModelo; 


    public AlertModelo getNotificacao(Integer id_usuario, String token, Integer id_escola, String ids_aluno, Double latitude, Double longitude) throws Exception { 


     /* dispara a requisição para a API retornar os dados do "recurso" necessário */ 
     resposta = new WebService().postToken(recurso, token, "{\"id_usuario\":" + id_usuario + "," + "\"id_escola\":" + id_escola + "," + "\"ids_aluno\":\"" + ids_aluno + "\"," + "\"latitude\":" + latitude + "," + "\"longitude\":" + longitude + "}"); 

     JSONObject mJSONObject = new JSONObject(resposta[1]); 

     if (resposta[1].equals("201")) { 

      mAlertModelo = new AlertModelo(); 
      mAlertModelo.setId_usuario(mJSONObject.getInt(String.valueOf(id_usuario))); 
      mAlertModelo.setId_escola(mJSONObject.getInt(String.valueOf(id_escola))); 
      mAlertModelo.setIds_aluno(mJSONObject.getInt(String.valueOf(ids_aluno))); 
      mAlertModelo.setLatitude(mJSONObject.getDouble(String.valueOf(latitude))); 
      mAlertModelo.setLongitude(mJSONObject.getDouble(String.valueOf(longitude))); 

     } 
     return mAlertModelo; 
    } 

} 
+0

Es würde helfen, wenn Sie richtig formatierten Code veröffentlicht haben. Im Moment sieht es aus wie ein riesiger Stapel verschachtelten Codes. –

+0

@JaySoyer dort, das gesamte Fragment – AND4011002849

+1

@JaySoyer Ich habe den Code bearbeitet, um die Formatierung zu beheben, aber es ist in der Tat ein riesiger Glob von verschachtelten Code, der einzige Weg, das zu beheben, ist Refactor und Objekte verwenden. WARpoluido, möchten Sie vielleicht etwas Refactoring berücksichtigen, kann es Ihnen helfen, Ihr zugrunde liegendes Problem aufdecken, indem Sie den Code aufräumen. –

Antwort

2

Der Code ist schwierig, da nur wenige verschachtelten Schleifen und laufende Tasks zu folgen. Wie auch immer, ich vermute, Sie den Code unten verursacht, wird die App alle (nicht ausgewählt) Elemente in der Liste zu speichern:

for (int i = 0; i < mArrayList.get(groupPosition).getalunos().size(); i++) { 
    Integer Idalunos = mArrayList.get(groupPosition).getalunos().get(i).getId_aluno(); 

    myIdList.add(Idalunos); 
} 

Hinweis: Iterieren durch die gesamte Liste ist ein Verdächtiger. Es sollte ein bestimmtes Element oder bestimmte Elemente in der Liste auswählen.

Also ... ein anderer Satz von relevanten Codes kann uns helfen, den Code zu beheben. Ich bin mir nicht sicher, ob es auch hier einen Fehler gibt.

parent.setItemChecked(index, true); 
parent.setSelectedChild(groupPosition, childPosition, true); 
parent.getChildAt(index); 

Hinweis: Diese Codes können in Ordnung sein. Der Schlüsselcode, denke ich, ist der Index. Ich kenne ExpandableListView nicht sehr gut. Schließlich

, schlug Code fix:

Integer Idalunos = mArrayList.get(groupPosition).getalunos().get(index).getId_aluno(); 
... 
myIdList.add(Idalunos); 

Beachten Sie die Variable Index verwendet wird, um das richtige Element zu erhalten, Idalunos.

2

Sie verwenden mArrayList Variable für Adapter initialisiert und für myIdList zur gleichen Zeit zu füllen. Natürlich würde myIdList die vollständige Liste Ihres Adapters enthalten.

UPDATE

Es wäre besser, myIdList als Feld Ihrer MainActivity Klasse zu definieren, und es in onCreateView Methode initialisieren.

Bei einem Klick nicht nur den Wert hinzufügen - Sie sollten überprüfen, ob dieser Wert allready in der Liste ist:

if(myIdList.contains(Idalunos)) { 
    myIdList.remove(Idalunos); 
} else { 
    myIdList.add(Idalunos); 
} 
+0

können Sie mir zeigen, wie Sie es mit mehr Details lösen können? danke – AND4011002849

+0

Zuerst - habe ich recht, dass ausgewählte Artikel in 'myIdList' enthalten sind? – Ircover

+0

yep, du hast Recht – AND4011002849

Verwandte Themen