Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ExpandableListView with multiple choice save selected item into an array

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

}
like image 876
AND4011002849 Avatar asked May 14 '15 14:05

AND4011002849


2 Answers

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.

like image 84
The Original Android Avatar answered Oct 27 '22 18:10

The Original Android


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);
}
like image 23
Ircover Avatar answered Oct 27 '22 20:10

Ircover