Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
GreeNicee
97 / 97 / 55
Регистрация: 04.10.2014
Сообщений: 250
Завершенные тесты: 2
#1

Пустое место в ListView при заполнении из файла - Программирование Android

03.06.2016, 16:15. Просмотров 241. Ответов 1
Метки нет (Все метки)

Есть ScrollView, внутри него LinearLayout, внутри которого статически созданы 2 кнопки "Открыть" и "Создать" обе кнопки вызывают рекурсивный генератор интерфейса, сам интерфейс создает неограниченное количество однотипных элементов - LL внутри него EditText,ImageButton и ListView.
Генератор интерфейса⇓
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
   public void generateLevels(int levelId, String parentLVitem) {
        LinearLayout.LayoutParams LLParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        RelativeLayout.LayoutParams RLparamsL = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        RelativeLayout.LayoutParams RLparamsR = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
 
 
        final LinearLayout layvar = (LinearLayout) findViewById(R.id.LL1);
        //уровень
        final LinearLayout layout;
        if ((LinearLayout) findViewById(levelId) == null) {
            layout = new LinearLayout(this);
            layout.setId(levelId);
            layout.setLayoutParams(LLParams);
            layout.setOrientation(LinearLayout.VERTICAL);
            layvar.addView(layout);
 
            TextView tvlevel = new TextView(this);
            tvlevel.setLayoutParams(LLParams);
 
            int k = 0;
 
           // Log.d("id", String.valueOf(levelId));
            for (int i = 0; i < 10; i++) {
                //Log.d("arr", String.valueOf(arrId[i]));
                if (arrId[i] == levelId) {
                    k = i + 1;
                   // Log.d("k", String.valueOf(k));
                    break;
                }
            }
 
            tvlevel.setText("Уровень " + k);
            tvlevel.setTextSize(24);
            layout.addView(tvlevel);
        } else {
            layout = (LinearLayout) findViewById(levelId);
        }
        //ЛЛ элемента
        final LinearLayout laycontainer = new LinearLayout(this);
        laycontainer.setId(hash(parentLVitem + "lay"));
        laycontainer.setLayoutParams(LLParams);
        laycontainer.setOrientation(LinearLayout.VERTICAL);
 
        TextView tv = new TextView(this);
        tv.setId(hash(parentLVitem + "tv"));
 
        RLparamsL.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        RLparamsL.addRule(RelativeLayout.LEFT_OF, R.id.but_var);
        RLparamsR.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
 
        final EditText et = new EditText(this);
        et.setId(hash(parentLVitem + "et"));
 
        final ImageButton ibut = new ImageButton(this);
        ibut.setId(hash(parentLVitem + "but"));
 
        final ListView lv = new ListView(this);
        lv.setId(hash(parentLVitem + "lv"));
 
        RelativeLayout laysub = new RelativeLayout(this);
 
        InputFilter[] fa = new InputFilter[1];
        fa[0] = new InputFilter.LengthFilter(25);
 
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setLayoutParams(LLParams);
 
        tv.setText("Элементы критерия " + parentLVitem);
        tv.setLayoutParams(LLParams);
        tv.setTextSize(20);
 
        et.setHint("Введите название");
        et.setLayoutParams(RLparamsL);
        et.setFilters(fa);
 
        ibut.setLayoutParams(RLparamsR);
        ibut.setImageResource(R.drawable.ic_action_add);
 
        laysub.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
 
        // Создаём пустой массив для хранения критериев
        final ArrayList<String> ar = new ArrayList<>();
 
        // Создаём адаптер ArrayAdapter, чтобы привязать массив к ListView
        final ArrayAdapter<String> ad;
        ad = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, ar);
 
        // Привяжем массив через адаптер к ListView
        lv.setAdapter(ad);
        // Прослушиваем нажатия клавиш
        ibut.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (ar.size() < 10) {
                    if (et.length() != 0) {
                        ar.add(0, et.getText().toString());
 
                        int k = 0;
                        int ki = 0;
                        int idpar = ((LinearLayout) laycontainer.getParent()).getId();
                       // Log.d("laypar", String.valueOf(idpar));
                        for (int i = 0; i < 10; i++) {
                            if (arrId[i] == idpar) {
                                ki = i + 1;
                                if (ki != 10) {
                                    k = arrId[i + 1];
                                    break;
                                }
                            }
                        }
 
                        if (ki != 10)
                            generateLevels(k, et.getText().toString());
                        et.setText("");
                        setListViewHeightBasedOnChildren(lv);
                        ad.notifyDataSetChanged();
                    } else {
                        Toast.makeText(getApplicationContext(), "Введите название!", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Больше 10 нельзя=)", Toast.LENGTH_SHORT).show();
                    et.setText("");
                }
            }
        });
        //ОБРАБОТКА КЛИКА НА ИТЕМ ЛИСТВИЕВА КРИТЕРИЕВ
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View itemClicked, final int position, long id) {
                AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
                adb.setTitle("Удалить?");
                adb.setMessage("Удалить критерий "" + ar.get(position) + "" ?");
                final int positionToRemove = position;
                adb.setNegativeButton("Отмена", null);
                adb.setPositiveButton("Ок", new AlertDialog.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        LinearLayout lllevel = (LinearLayout) ((LinearLayout) lv.getParent()).getParent();
                        LinearLayout ll;
                        String str;
                        int k = 0;
                        for (int i = 0; i < arrId.length; i++) {
                            if (lllevel.getId() == arrId[i]) {
                                k = arrId[i + 1];
                            }
                        }
                        lllevel = (LinearLayout) findViewById(k);
                        for (int i = 0; i < (lllevel).getChildCount(); i++) {//Внутри уровня
                            if (lllevel.getChildAt(i) instanceof LinearLayout) {
                                ll = (LinearLayout) lllevel.getChildAt(i);
                                for (int j = 0; j < ll.getChildCount(); j++) {//Внутри ЛЛ критерия
                                    if (ll.getChildAt(j) instanceof TextView) {
                                        str = ((TextView) ll.getChildAt(j)).getText().toString();
                                        str = str.substring(str.lastIndexOf("_")+1);
 
                                        if (str.equals(ar.get(position))) {
                                            lllevel.removeView(ll);
                                            if ((lllevel.getChildCount()) == 1) {
                                                layvar.removeView(lllevel);
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        ar.remove(positionToRemove);
                        setListViewHeightBasedOnChildren(lv);
                        ad.notifyDataSetChanged();
                    }
                });
                adb.show();
            }
        });
 
        laycontainer.addView(tv);
        laycontainer.addView(laysub);
        laysub.addView(et);
        laysub.addView(ibut);
        laycontainer.addView(lv, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        setListViewHeightBasedOnChildren(lv);
        layout.addView(laycontainer);
 
    }

Поскольку ListView конфликт с ScrollView'ом, методом гугления была найдена следующая функция, которая раскрывает полностью список)
Функция для "развертывания" списка⇓
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }
 
        int totalHeight = 0;
        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight += listItem.getMeasuredHeight();
        }
 
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }

И при самостоятельном заполнении элементов все работает нормально,но при считывании из файла, которое представляет из себя последовательный вызов все того же рекурсивного генератора с необходимыми параметрами, мистическим (возможно и вполне очевидным, но я последние несколько недель нахожусь совершенно в неадекватном состоянии и не вижу явных на то причин) образом появляется пустое пространство (не пустые элементы, а именно пустое пространство).
Сами данные сохраняются в *.txt файл (не было времени гуглить про типизированные) с добавлением ключевых слов (для перехода на следующий уровень или на следующую группу дочерних элементов) и разделяется это все символом "_".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2016, 16:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пустое место в ListView при заполнении из файла (Программирование Android):

Ошибка при заполнении ArrayList из массива - Программирование Android
Добрый Товарищи! делаю так: // создаем адаптер fillData(MainActivity.MassiveSections/*это String массив*/); ...

Выкидывает NullPointerException при заполнении данных через ArrayAdapter - Программирование Android
Заполняю данные из массива Food.foods с помощью ArrayAdapter в ListView макета activity_food_category.xml. При заполнении выкидывает ошибку...

Как проверить пустое SharedPreferences или нет при загрузке активити? - Программирование Android
У меня вот такая задача при первой загрузке приложения ничего. В строку ввода я ввожу разные фразы и сохраняю в preferences. При следующей...

Ошибка при клике на пустое место в ListBox - C#
Как сделать чтобы при нажатии на пустое место в listbox'e не выдовал ошибку?

ListView мерцает при заполнении записями - Visual Basic
Это происходит если при добавлении выполнять DoEvents Как бы это безобразие прекратить? Пересмотрел кучу прог, там все с этим...

При заполнении ListView полоса прокрутки по вертикали не появляется - Visual Basic
При заполнении ListView (из-за количества записей) полоса прокрутки по вертикали не появляется. Т.е. по кнопкам 'Вверх', 'Вниз' можно...

1
GreeNicee
97 / 97 / 55
Регистрация: 04.10.2014
Сообщений: 250
Завершенные тесты: 2
03.06.2016, 16:15  [ТС] #2
(Не влезло))Открытие файла⇓
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
    void displayFiles() {
        ArrayList<String> lst = new ArrayList<String>();
        final String folder = Environment.getExternalStorageDirectory().toString();
        String sdState = android.os.Environment.getExternalStorageState(); //Получаем состояние SD карты (подключена она или нет) - возвращается true и false соответственно
        if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) { // если true
            File f1 = new File(folder + "/SPPR"); //Создаем файловую переменную
            if (!f1.exists()) { //Если папка не существует
                f1.mkdirs();
            }  //создаем её
        }
 
        File f1 = new File(folder + "/SPPR");
        File[] filesArray = f1.listFiles();
        int k = 0;
 
        //for (File f: filesArray) {
        for (int i = 0; i < filesArray.length; i++) {
            lst.add(filesArray[i].getName().replace(".txt", ""));
           // Log.d("list", lst.get(i).toString());
        }
 
        String[] myArray = {}; // конвертируем ArrayList в массив
        myArray = lst.toArray(new String[lst.size()]);
 
        final String[] list = myArray;
 
        if (list.length > 0) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Выберите ситуацию"); // заголовок для диалога
            builder.setItems(list, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    Toast.makeText(getApplicationContext(), "Выбранна ситуация: " + list[item], Toast.LENGTH_SHORT).show();
                    EditText ed_name = (EditText) findViewById(R.id.ed_ir_name);
                    ListView lv_al = (ListView) findViewById(R.id.lv_alter);
                    ListView lv_var = (ListView) findViewById(R.id.lv_var);
 
                    File file = new File(folder + "/SPPR/" + list[item] + ".txt");
                    try {
                        file.createNewFile();
 
                        FileReader fRd = new FileReader(file);
                        BufferedReader reader = new BufferedReader(fRd);
                        String str;
                        StringBuffer buffer = new StringBuffer();
 
                        while ((str = reader.readLine()) != null) {
                            buffer.append(str + "\n");
                        }
                        fRd.close();
 
                        String[] arr = buffer.toString().split("_");
 
                        for (int i=0;i<arr.length;i++){
                            if ((arr[i].equals("_"))||(arr[i].equals(""))){
                                arr = ArrayUtils.removeElement(arr, arr[i]);
                            }
                        }
 
                        int k = 0;
 
                        for (int i = 0; i < arr.length; i++) {
                            if (arr[i].equals("next")) {
                                k = i;
                               // Log.d("ARR", arr[i]);
                              //  Log.d("k", String.valueOf(k));
                                break;
                            }
                        }
 
                        int k1 = 0;
                        for (int i = k+1; i < arr.length; i++) {
                            if (arr[i].equals("lvl")) {
                                k1 = i;
                                break;
                            }
                        }
 
                        String[] st_ar_var = new String[k1-(k+1)];
                        String[] st_ar_al = new String[k];
                       // Log.d("lng", String.valueOf((arr.length - k)));
                        ar_al.clear();
                        ar_var.clear();
 
                        System.arraycopy(arr, k + 1, st_ar_var, 0, st_ar_var.length);
                        System.arraycopy(arr, 0, st_ar_al, 0, k);
 
                        for (int i = 0; i < st_ar_al.length; i++) {
                            ar_al.add(i, st_ar_al[i]);
                           // Log.d("ar_al", ar_al.get(i));
                           // Log.d("st_ar_al", st_ar_al[i]);
                        }
 
                        ImageButton ibut = (ImageButton) findViewById(R.id.but_var);
                        EditText et = (EditText) findViewById(R.id.ed_var);
                        //TextView tv = (TextView) findViewById(R.id.tv_null);
                        for (int i = 0; i < st_ar_var.length; i++) {
                            et.setText(st_ar_var[i]);
                            ibut.performClick();
                        }
 
                        setListViewHeightBasedOnChildren(lv_al);
                        setListViewHeightBasedOnChildren(lv_var);
 
                        ed_name.setText(list[item]);
 
                        int i = k1;
                        int ki = 0;
                        int itv = 0;
                        int iib = 0;
                        int iet = 0;
                        boolean boo = false;
 
                        LinearLayout laylevel,laycontainer;
                        TextView tv;
                        ListView lv;
 
                        laylevel = (LinearLayout) findViewById(arrId[ki]);
                        laycontainer = (LinearLayout) findViewById(arrId[ki]);
                        tv = (TextView) findViewById(R.id.tv_null);
                        lv = (ListView) findViewById(R.id.lv_var);
                        RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl_null);
 
                        do {
                            if (arr[i].equals("lvl")){
                                ki++;
                                laylevel = (LinearLayout) findViewById(arrId[ki]);
                                i += 1;
                            }else
                            if (arr[i].equals("next")){
                                boo = false;
                                for (int j=0;j<laylevel.getChildCount();j++){
                                    if (boo)
                                        break;
                                    if (laylevel.getChildAt(j) instanceof LinearLayout){
                                        laycontainer = (LinearLayout) laylevel.getChildAt(j);
                                        for (int ii=0;ii<laycontainer.getChildCount();ii++){
                                            if (laycontainer.getChildAt(ii) instanceof TextView)
                                                itv = ii;
                                            else
                                            if (laycontainer.getChildAt(ii) instanceof ListView)
                                                lv = (ListView) laycontainer.getChildAt(ii);
                                            if (laycontainer.getChildAt(ii) instanceof RelativeLayout){
                                                rl = (RelativeLayout) laycontainer.getChildAt(ii);
                                                for (int o=0;o<rl.getChildCount();o++){
                                                    if (rl.getChildAt(o) instanceof ImageButton)
                                                        iib = o;
                                                    else
                                                    if (rl.getChildAt(o) instanceof EditText)
                                                        iet = o;
                                                }
                                            }
                                            if (ii+1 == laycontainer.getChildCount()) {
                                                tv = (TextView) laycontainer.getChildAt(itv);
                                                ibut = (ImageButton) rl.getChildAt(iib);
                                                et = (EditText) rl.getChildAt(iet);
 
                                                String str_tv = tv.getText().toString();
                                                str_tv = str_tv.substring(str_tv.lastIndexOf("_") + 1);
                                                if (str_tv.equals(arr[i+1])){
                                                    boo = true;
                                                    i += 2;
                                                    break;
                                                }
                                            }
 
                                        }
                                    }
                                }
                            }
                            else{
                                et.setText(arr[i]);
                                ibut.performClick();
 
                                i++;
                            }
                        }while (i<arr.length-1);//В конце пробел почему-то
                    } catch (IOException e) {
                        Toast.makeText(getApplicationContext(), "Exception: " + e.toString(), Toast.LENGTH_LONG).show();
                    }
                }
            });
            builder.setCancelable(false);
            builder.show();
        } else {
            Toast.makeText(getApplicationContext(), "Вы еще не создавали шаблоны ситуаций", Toast.LENGTH_SHORT).show();
        }
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2016, 16:15
Привет! Вот еще темы с ответами:

Открываются вкладки и рекламные окна при нажатии на пустое место или ссылку - Удаление вирусов
Здравствуйте! С недавних пор появилась такая проблема. Стоит лицензионный касперский антивирус. Он постоянно кричит о каких-то файлах...

При клике на любую ссылку или даже пустое место открывается страница с рекламой - Удаление вирусов
При клике на любую ссылку открывается страница с рекламой. Раньше открывалась &quot;сбоку&quot;, теперь автоматически переносит на эту...

Доброго времени суток Вам)Подскажите пожалуйста что за пустое место при просмотре в браузере? - HTML, CSS
&lt;div class=&quot;rightblock&quot;&gt; &lt;div class=&quot;product&quot;&gt; &lt;a href=&quot;#&quot; class=&quot;cafe&quot;&gt;&lt;img src=&quot;userfiles/cofe.png&quot; width=&quot;135&quot;...

Открываются рекламные окна и при нажатии на пустое место или ссылку вкладки на latest-359198.epara.ru - Удаление вирусов
Здравствуйте! На днях боролся с маячком, вроде убрал и тут оффтоп собственно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru