ExpandableListView with multiple choice save selected item into an array
Asked Answered
W

2

9

I have an array that is filled with API data, and I have an expandablelistview to show the items of that array, now what I'm trying to do is when the user clicks on an item it saves th ID of that item into an array, so if the user select 2 items I want 2 Ids in my array, what is happening now is this: no matter if I select only one of the items it gets all of them and save it inside my 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;
    }

}
Wort answered 14/5, 2015 at 14:27 Comment(5)
It would help if you posted properly formatted code. Right now, it looks like a giant glob of nested code.Indiscerptible
@JaySoyer there, the entire fragmentWort
@JaySoyer I edited the code to fix the formatting, but it is indeed a giant glob of nested code, the only way to fix that is to refactor and use objects. WARpoluido, you might want want to consider some refactoring, it may help you unearth your underlying problem by cleaning up the code.Quintessa
Please format the code so that when can help u better.Twaddle
How is your debugging going so far? any progress?Postgraduate
P
2

The code is difficult to follow due to few nested loops and running tasks. Anyway, I suspect the code below is causing your app to save all (unselected) items in the list:

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

   myIdList.add(Idalunos);
}

Note: Iterating through the entire list is a suspect. It should pick a certain item or items in the list.

So...another set of relevant codes can help us determine the code fix. I am not certain if there is a bug here also.

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

Note: These codes may be fine. The key code, I think, is the index. I am not too familiar with ExpandableListView.

Finally, suggested code fix:

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

Notice the variable index is used to get the correct item, Idalunos.

Postgraduate answered 22/5, 2015 at 9:8 Comment(0)
P
2

You are using mArrayList variable for initializing adapter and for filling myIdList at the same time. Of course myIdList would contain full list of your adapter.

UPDATE

It would be better to define myIdList as field of your MainActivity class and initialize it in onCreateView method.

On click not just add the value - you should check if this value is allready in list:

if(myIdList.contains(Idalunos)) {
    myIdList.remove(Idalunos);
} else {
    myIdList.add(Idalunos);
}
Pyroxene answered 18/5, 2015 at 13:29 Comment(3)
At first - am I right that selected items contains in myIdList?Pyroxene
Ok. For what AlertRest class and for what getNotificacao method?Pyroxene
I've updated the question, the AlertRest class is to post notificationWort
P
2

The code is difficult to follow due to few nested loops and running tasks. Anyway, I suspect the code below is causing your app to save all (unselected) items in the list:

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

   myIdList.add(Idalunos);
}

Note: Iterating through the entire list is a suspect. It should pick a certain item or items in the list.

So...another set of relevant codes can help us determine the code fix. I am not certain if there is a bug here also.

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

Note: These codes may be fine. The key code, I think, is the index. I am not too familiar with ExpandableListView.

Finally, suggested code fix:

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

Notice the variable index is used to get the correct item, Idalunos.

Postgraduate answered 22/5, 2015 at 9:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.