Странное поведение TableLayout в конце ScrollView - PullRequest
0 голосов
/ 24 августа 2018

Я создаю TableLayouts в ScrollView программно, и я могу изменить содержимое этих TableLayout, добавляя / удаляя динамически некоторые TableRows.

Дело в том, что все работает нормальноза исключением последнего, который ведет себя странным образом без видимой причины.

Когда я добавляю / удаляю некоторые TableRows в TableLayouts над «проблемным», в нем есть несколько ячеек, которыевнезапно показывают содержимое в столбцах с одним символом на столбцы и выходят из ячейки, не растягивая ячейку, и это делает содержимое нечитаемым.

Я не знаю, почему это происходит, потому что этотолько один с этим вопросом.Я думаю, что проблема, вероятно, связана с тем фактом, что ScrollView изменяет свой размер при изменении содержимого в нем, и поскольку «проблемный» TableLayout находится в конце ScrollView, он вызывает некоторые неожиданные изменения.

Как мне решить эту проблему?

Код:

private List<List<View>> addModifiableLinesToView(final TableLayout view, final String fichier,
                                                  final int[] ordreVoulu, final TreeMap<String,ArrayList> map, final RadioGroup rg) {
    final List<List<View>> listRes = new ArrayList<>();

    try{
        //Recherche de valeurs dans le fichier CSV du module en question ex: csv_bt.csv
        InputStream is = new FileInputStream(Environment.getExternalStorageDirectory() +
                "/" + folder_main + "/" + imported_data + "/" + fichier);
        CSVFile csv = new CSVFile(is);
        List<String[]> tableau = csv.findLines(indicePoste.getText().toString());
        List<View> tempList;

        //Pour chaque ligne avec le bon numéro de poste trouvé dans le csv
        for (String[] s : tableau) {
            tempList = new ArrayList<>();
            //met les valeurs dans le bon ordre pour les ajouter au tableau
            String[] vals = filtreValeurs(s, ordreVoulu);
            final TableRow row = new TableRow(getApplicationContext());
            row.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    TableLayout.LayoutParams.WRAP_CONTENT));

            int n = 0;
            //ajoute les valeurs récupérées a une ligne du tableau
            for (String valeur : vals) {

                View divider = new View(getApplicationContext());
                divider.setLayoutParams(new TableLayout.LayoutParams(
                        TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT));
                divider.setBackgroundColor(Color.BLACK);

                final ViewSwitcher viewSwitcher = new ViewSwitcher(getApplicationContext());

                TextView t = new TextView(MainActivity.this);
                LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
                t.setLayoutParams(params1);
                t.setMaxWidth(0);
                if(fichier.equals("csv_amm.csv") && n == 3)
                {
                    valeur = valeur.trim();
                    int val = !valeur.equals("")?Integer.parseInt(valeur) : 0;
                    AMMValue ammval = new AMMValue(val);
                    t.setText(ammval.getLibelle());
                }
                else
                    t.setText(valeur);

                t.setGravity(Gravity.CENTER);
                t.setTextColor(Color.BLACK);
                t.setTextSize(14);
                t.setPadding(5,5,5,5);
                t.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if(rg.getCheckedRadioButtonId() != -1)
                            viewSwitcher.showNext();
                    }
                });

                viewSwitcher.addView(t,
                        new TableRow.LayoutParams(
                                TableRow.LayoutParams.MATCH_PARENT,
                                TableRow.LayoutParams.MATCH_PARENT, 1f));

                final String key = (String)map.keySet().toArray()[n];

                if(key.contains("EditText"))
                {
                    final EditText e = new EditText(MainActivity.this);
                    LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT,
                            ViewGroup.LayoutParams.WRAP_CONTENT);
                    e.setLayoutParams(params2);
                    e.setSingleLine();
                    e.setImeOptions(EditorInfo.IME_ACTION_DONE);
                    e.setBackgroundColor(getResources().getColor(R.color.orange));
                    e.setMaxWidth(0);
                    e.setTextSize(14);
                    e.setPadding(5,5,5,5);
                    e.setGravity(Gravity.CENTER);
                    //En fonction de la valeur va afficher un clavier numérique ou non
                    if(key.contains("Number"))
                        e.setInputType(InputType.TYPE_CLASS_NUMBER);
                    else if(key.contains("Text"))
                        e.setInputType(InputType.TYPE_CLASS_TEXT);
                    /*
                     *TextChangedListener qui permet de retourner au mode "TextView"
                     *quand on supprime tout ce qui à été écris
                     */
                    e.addTextChangedListener(new TextWatcher() {
                        @Override
                        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                        }
                        @Override
                        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                            if(e.length() == 0)
                            {
                                viewSwitcher.showPrevious();
                                cacherClavierVirtuel();
                            }
                        }

                        @Override
                        public void afterTextChanged(Editable editable) {

                        }
                    });

                    viewSwitcher.addView(e,
                            new TableRow.LayoutParams(
                                    TableRow.LayoutParams.MATCH_PARENT,
                                    TableRow.LayoutParams.MATCH_PARENT, 1f));
                }
                else if (key.contains("Spinner"))
                {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            final Spinner spin = new Spinner(getApplicationContext());
                            spin.getBackground().setColorFilter(
                                    getResources().getColor(R.color.noir),
                                    PorterDuff.Mode.SRC_ATOP);
                            spin.setBackgroundColor(getResources().getColor(R.color.orange));
                            spin.setGravity(Gravity.CENTER);
                            spin.setPopupBackgroundResource(R.color.blanc);
                            spin.setPadding(5,5,5,5);
                            ArrayList<String> list = map.get(key);
                            final ArrayAdapter<String> adapter = new ArrayAdapter<>(
                                    MainActivity.this,
                                    R.layout.spinner_adapter,
                                    list);
                            adapter.setDropDownViewResource(
                                    android.R.layout.simple_spinner_dropdown_item);
                            spin.setAdapter(adapter);

                            //Set de la selection à 1 pour ne pas annuler tout de suite
                            spin.setSelection(1);
                            /* ItemListener qui va retourner le ViewSwitcher en mode
                             * affichage si l'on selectionne la valeur index 0 qui
                             * correspond à "Annuler" */
                            spin.setOnItemSelectedListener(
                                    new AdapterView.OnItemSelectedListener() {
                                        @Override
                                        public void onItemSelected(
                                                AdapterView<?> adapterView, View view, int i, long l) {
                                            ((TextView) adapterView.getChildAt(0)).setTextSize(14);
                                            if (adapterView.getSelectedItemPosition() == 0 && rg.getCheckedRadioButtonId() != -1) {
                                                spin.setSelection(1);
                                                viewSwitcher.showPrevious();
                                            }

                                        }

                                        @Override
                                        public void onNothingSelected(AdapterView<?> adapterView) {

                                        }
                                    });

                            viewSwitcher.addView(spin,
                                    new TableRow.LayoutParams(
                                            TableRow.LayoutParams.MATCH_PARENT,
                                            TableRow.LayoutParams.MATCH_PARENT, 1f));
                        }
                    });
                }


                tempList.add(viewSwitcher);

                row.addView(divider,
                        new TableRow.LayoutParams(
                                TableRow.LayoutParams.MATCH_PARENT,
                                TableRow.LayoutParams.MATCH_PARENT));
                row.addView(viewSwitcher,
                        new TableRow.LayoutParams(
                                TableRow.LayoutParams.MATCH_PARENT,
                                TableRow.LayoutParams.MATCH_PARENT, 1f));
                n++;
            }

            //separateur en fin de ligne
            View divider = new View(getApplicationContext());
            divider.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    TableLayout.LayoutParams.MATCH_PARENT));
            divider.setBackgroundColor(Color.BLACK);
            row.addView(divider,
                    new TableRow.LayoutParams(
                            TableRow.LayoutParams.MATCH_PARENT,
                            TableRow.LayoutParams.MATCH_PARENT));
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    view.addView(row);
                }
            });

            //separateur horizontal
            final View dividerH = new View(getApplicationContext());
            dividerH.setLayoutParams(new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.MATCH_PARENT,
                    3));
            dividerH.setBackgroundColor(Color.BLACK);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    view.addView(dividerH, new TableLayout.LayoutParams(
                            TableLayout.LayoutParams.MATCH_PARENT,
                            3));
                }
            });
            listRes.add(tempList);
        }
    }
    catch (ArrayIndexOutOfBoundsException e)
    {
        e.printStackTrace();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this,
                        "Erreur de format du CSV pour : " + view.getTag().toString(),
                        Toast.LENGTH_LONG).show();
            }
        });

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

    return listRes;
...