Я создаю 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;