Урок 45. Список-дерево ExpandableListView

Обсуждение уроков
Аватара пользователя
BeKZaT
Сообщения: 41
Зарегистрирован: 27 сен 2013, 23:28

Re: Урок 45. Список-дерево ExpandableListView

Сообщение BeKZaT » 17 ноя 2013, 18:07

Foenix писал(а):вы хотите, чтоб я за вас почитала всю ветку?
Нет. Я название неправильно прочитал или вы не правильно написали (кастомный иерархический вью)
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 17 ноя 2013, 18:18

это такой вью, только не стандартный, просто кто-то пишет свою библиотеку, которую можно использовать. Эту библиотеку подключаешь в свой проект (по ссылкам есть инструкция как это сделать). Такие компоненты обычно хорошо настраиваются. Например, тот, который использовала я - можно менять внешний вид, цвета, добавлять чекбоксы и картинки, а так же делать не два уровня иерархии, а сколько угодно.
Поищите в гугле "polidea treeview"
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 17 ноя 2013, 18:22

Кстати, и обычный ExpandableListView можно кастомизировать, вроде бы с картинками. Вот за полсекунды нагуглилось
http://imobiledevelopment.blogspot.ru/2 ... droid.html
http://learnandroideasily.blogspot.ru/2 ... ample.html
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
BeKZaT
Сообщения: 41
Зарегистрирован: 27 сен 2013, 23:28

Re: Урок 45. Список-дерево ExpandableListView

Сообщение BeKZaT » 17 ноя 2013, 18:33

Foenix писал(а):Кстати, и обычный ExpandableListView можно кастомизировать, вроде бы с картинками. Вот за полсекунды нагуглилось
http://imobiledevelopment.blogspot.ru/2 ... droid.html
http://learnandroideasily.blogspot.ru/2 ... ample.html
Огромное спасибо :D
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 17 ноя 2013, 18:36

Пожалуйста :)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Batzzilla
Сообщения: 1
Зарегистрирован: 02 ноя 2013, 22:43

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Batzzilla » 16 фев 2014, 17:43

Наверное нубский вопрос.
Код:

String[] item;
...
item = getResources().getStringArray(R.array.itemName);

Как объяснить Эклипсу, что itemName - это не имя массива, а имя переменной?
В этом месте кода в зависимости от действий юзера должны загружаться разные массивы, с разными именами, с разным количеством строк.
И массивов этих 1500 штук.
Не хочется говнокода.
Заранее спасибо.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Урок 45. Список-дерево ExpandableListView

Сообщение парень » 17 фев 2014, 15:17

А массивы эти изменяются? Или они всегда одинаковые?
Если изменяются - почему не базу данных использовать? Даже если они неизменны - почему бд не использовать?

Попробуйте getIdentifer попробовать. У меня в первых опытах было подобное решение - обращение к кнопочкам по названию в переменной.

Примерная структура бд для древовидного списка- две таблицы, в одной заголовки и id, во второй id, Id_za(id загаловка из таблицы заголовков), и текст.
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Lucifer777
Сообщения: 122
Зарегистрирован: 18 ноя 2013, 17:53

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Lucifer777 » 29 апр 2014, 10:15

А как сделать так, что бы когда ExpandableList раскрывается экран находился в начале подгруппы а не перебрасывал на середину?

dimvolk
Сообщения: 1
Зарегистрирован: 24 мар 2014, 14:56

Re: Урок 45. Список-дерево ExpandableListView

Сообщение dimvolk » 30 апр 2014, 11:22

Здравствуйте!
Сделал список, все работает как надо. Хотел добавить разные изображения для групп.
адаптер BaseExpandableListAdapter. Списки формирую примерно по уроку
Ветку читал и перечитывал, в гугле копался все равно ничего.
Как это можно сделать?
Спасибо

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Sebler » 04 май 2014, 06:10

Всем привет. На основе урока сделал свой ExpandableListAdapter и пытаюсь динамически добавлять в него иконки. Для этого в разметке группы создал пустой LinearLayout и в адаптере при заполнении группы списка вставляю в него иконки т.е. ImageView. Проблема в том, что иконки добавляются, но больше чем нужно. При первом запуске списка их больше в три раза, и потом при каждом закрытии или раскрытии группы они тоже добавляются. Никак не пойму в чём дело.
Для того, чтобы код был понятнее расскажу в чём суть. Список отображает расписание маршрута. Маршрут всегда один (в смысле количества, а не один и тот же), значит и группа списка тоже одна, а дети группы это подробное описание маршрута. Каждый "деть" соответствует пересадке с линии на линию. Группа списка содержит, помимо времени отправки и прибытия, информацию а линиях маршрута в текстовой форме и в виде иконок. Т.е. автобус, метро и т.д. Иконки я добавляю на основе информации из джейсонОтвета. После его парсинга, я получаю HashMap для группы списка, которая содержит ключи с названием vehicle_type0, vehicle_type1, vehicle_type2 и т.д. в зависимости от того, сколько типов транспорта имеет маршрут. А значения ключей, к примеру subway, train и т.д. то есть всё то, что даёт нам ответ от Google Directions API. И потом при построении списка в методе адаптера getGroupView() я динамически добавляю столько иконок, сколько ключей с началом vehicle_type в названии содержит HashMap. Но вот, как я уже писал выше, количество иконок изначально больше и при каждом клике по группе списка тоже увеличивается. Видимо я их как-то не правильно добавляю в разметку группы списка. Привожу код всего адаптера, проблема в самом низу кода, в методе getGroupView() в цикле for().

Код: Выделить всё

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class NaviTravelInfoAdapter extends Activity {
  
  // коллекция для групп
  ArrayList<Map<String,Object>> groupData;
  
  // общая коллекция для коллекций элементов
  ArrayList<ArrayList<Map<String,Object>>> childData;

  ExpandableListView elvMain;
  
  int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;
  
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.navi_travel_info_adapter);
        
		Intent intent = getIntent();
		String httpResponse = intent.getStringExtra("httpResponse");
		NaviJsonParser njp = new NaviJsonParser(httpResponse);
        // заполняем коллекцию групп из массива с названиями групп
        groupData = njp.getTransitTravelInfo();
        
        // создаем коллекцию для коллекций элементов 
        childData = njp.getTransitTravelStepsInfo(); 

        ExpandableListAdapter adapter = new ExpandableListAdapter(this, groupData, childData);
        elvMain = (ExpandableListView) findViewById(R.id.elvTravelInfoList);
        elvMain.setAdapter(adapter);
    }
    
    class ExpandableListAdapter extends BaseExpandableListAdapter {

        @Override
        public boolean areAllItemsEnabled()
        {
            return true;
        }

        private Context context;

        private ArrayList<Map<String,Object>> groups;

        private ArrayList<ArrayList<Map<String,Object>>> children;

        public ExpandableListAdapter(Context context, ArrayList<Map<String,Object>> groups,
        		ArrayList<ArrayList<Map<String,Object>>> children) {
            this.context = context;
            this.groups = groups;
            this.children = children;
        }

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return children.get(groupPosition).get(childPosition);
        }

        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
        
        // Return a child view. You can load your custom layout here.
        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                View convertView, ViewGroup parent) {
            Map mapItm = (HashMap) getChild(groupPosition, childPosition);
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.navi_travel_info_item, null);
            }
            TextView depTime = (TextView) convertView.findViewById(R.id.tvNTIi_deptime);
            depTime.setText((CharSequence) mapItm.get("departure_time"));

            TextView arrTime = (TextView) convertView.findViewById(R.id.tvNTIi_arrtime);
            arrTime.setText((CharSequence) mapItm.get("arrival_time"));

            TextView depStop = (TextView) convertView.findViewById(R.id.tvNTIi_DepStop);
            depStop.setText((CharSequence) mapItm.get("departure_stop"));

            TextView arrStop = (TextView) convertView.findViewById(R.id.tvNTIi_ArrStop);
            arrStop.setText((CharSequence) mapItm.get("arrival_stop"));

    		ImageView imgDir = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgDirection);
    		imgDir.setImageResource(R.drawable.list_icon_ka_40);

    		ImageView imgDep = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgDep);
    		imgDep.setImageResource(R.drawable.list_icon_ka_40);
    		
    		ImageView imgArr = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgArr);
    		imgArr.setImageResource(R.drawable.list_icon_ka_40);

    		ImageView imgWrngs = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgWarnings);
    		imgWrngs.setImageResource(R.drawable.list_icon_ka_40);
    		
            return convertView;
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return children.get(groupPosition).size();
        }

        @Override
        public Object getGroup(int groupPosition) {
            return groups.get(groupPosition);
        }

        @Override
        public int getGroupCount() {
            return groups.size();
        }

        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        // Return a group view. You can load your custom layout here.
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                ViewGroup parent) {
        	Map mapGrp = (HashMap) getGroup(groupPosition);
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.navi_travel_info_group, null);
            }
            TextView depTime = (TextView) convertView.findViewById(R.id.tvNTIg_deptime);
            depTime.setText((CharSequence) mapGrp.get("departure_time"));

            TextView arrTime = (TextView) convertView.findViewById(R.id.tvNTIg_arrtime);
            arrTime.setText((CharSequence) mapGrp.get("arrival_time"));

            TextView trvlLines = (TextView) convertView.findViewById(R.id.tvNTIg_lines);
            trvlLines.setText((CharSequence) mapGrp.get("travel_lines"));
        
            LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(
                    wrapContent, wrapContent);
            lParams.setMargins(5, 5, 0, 0);

            LinearLayout imgsGroup = (LinearLayout) ((ViewGroup) convertView).findViewById(R.id.imgNTIg_ImgsGroup);
			
            
			for (Object actKey : mapGrp.keySet()) {
				if (((String) actKey).startsWith("vehicle_type")) {
					ImageView imgV = new ImageView(NaviTravelInfoAdapter.this);
					imgV.setImageResource((int) mapGrp.get(actKey));
					imgsGroup.addView(imgV, lParams);
				}
			}
            
            return convertView;
        }

        @Override
        public boolean hasStableIds() {
            return true;
        }

        @Override
        public boolean isChildSelectable(int arg0, int arg1) {
            return true;
        }

    }
}

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 45. Список-дерево ExpandableListView

Сообщение KamiSempai » 04 май 2014, 12:05

Нужно учитывать тот факт, что в списках View переиспользуется.
Очищайте imgsGroup перед его повторным заполнением: imgsGroup.removeAllViews()
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Sebler » 06 май 2014, 20:49

Снова здравствуйте. Продолжаю работать с ExpandableListAdapter. Ситуация следующая. Как и прежде он должен показывать описание маршрута со всеми пересадками, где группа списка это маршрут, а подгруппы (child) - пересадки. До сих пор я использовал пересадки с транспорта на транспорт и всё работало, но теперь хотел добавить и пешие пересадки, т.е. когда до той или иной остановки ещё дойти нужно, чтобы продолжить поездку на транспорте. Т.о. получаем полноценную информацию о маршруте. В коде типы пересадок имеют обозначение "WALKING" и "TRANSIT", для пешей и транспортной пересадок соответственно. В код добавил всего ничего, просто ещё одно условие "если то". В итоге получаю список с пустыми полями child, хотя количество этих child соответствует нужному.
Кажется дело в механизме заполнения "детей" адаптером, но я никак не пойму в чём дело.
На всякий случай снова весь адаптер, но проблема, как я понимаю, только в методе getChildView().

Код: Выделить всё

public class NaviTravelInfoAdapter extends Activity {
  

  ArrayList<Map<String,Object>> groupData;

  ArrayList<ArrayList<Map<String,Object>>> childData;

  ExpandableListView elvMain;
  int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.navi_travel_info_adapter);
        
		Intent intent = getIntent();
		String httpResponse = intent.getStringExtra("httpResponse");
		NaviJsonParser njp = new NaviJsonParser(httpResponse);

        groupData = njp.getTransitTravelInfo();

        childData = njp.getTransitTravelStepsInfo(); 

        ExpandableListAdapter adapter = new ExpandableListAdapter(this, groupData, childData);
        elvMain = (ExpandableListView) findViewById(R.id.elvTravelInfoList);
        elvMain.setAdapter(adapter);
    }
    
    class ExpandableListAdapter extends BaseExpandableListAdapter {
        @Override
        public boolean areAllItemsEnabled()
        {
            return true;
        }
        private Context context;
        private ArrayList<Map<String,Object>> groups;
        private ArrayList<ArrayList<Map<String,Object>>> children;

        public ExpandableListAdapter(Context context, ArrayList<Map<String,Object>> groups,
        		ArrayList<ArrayList<Map<String,Object>>> children) {
            this.context = context;
            this.groups = groups;
            this.children = children;
        }
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return children.get(groupPosition).get(childPosition);
        }
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                View convertView, ViewGroup parent) {
            Map mapItm = (HashMap) getChild(groupPosition, childPosition);
            String tm = (String) mapItm.get("travel_mode");
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//                if(tm == "WALKING")
//                	convertView = infalInflater.inflate(R.layout.navi_travel_info_item_walking, null);
//                else if(tm == "TRANSIT")
                    convertView = infalInflater.inflate(R.layout.navi_travel_info_item_transit, null);
            }

            if(tm == "WALKING") {
                TextView travel_mode = (TextView) convertView.findViewById(R.id.tvNTIi_linename);
                travel_mode.setText((CharSequence) mapItm.get("html_instructions"));
            }
            else if(tm == "TRANSIT") {
	            TextView depTime = (TextView) convertView.findViewById(R.id.tvNTIi_deptime);
	            depTime.setText((CharSequence) mapItm.get("departure_time"));
	
	            TextView arrTime = (TextView) convertView.findViewById(R.id.tvNTIi_arrtime);
	            arrTime.setText((CharSequence) mapItm.get("arrival_time"));
	
	            TextView depStop = (TextView) convertView.findViewById(R.id.tvNTIi_DepStop);
	            depStop.setText((CharSequence) mapItm.get("departure_stop"));
	
	            TextView arrStop = (TextView) convertView.findViewById(R.id.tvNTIi_ArrStop);
	            arrStop.setText((CharSequence) mapItm.get("arrival_stop"));
	
	            TextView trvlDir = (TextView) convertView.findViewById(R.id.tvNTIi_direction);
	            trvlDir.setText((CharSequence) mapItm.get("headsign"));
	
	            TextView lineName = (TextView) convertView.findViewById(R.id.tvNTIi_linename);
	            lineName.setText((CharSequence) mapItm.get("lineName"));
	
	            ImageView imgDir = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgDirection);
	    		imgDir.setImageResource(R.drawable.list_icon_richtung);
	
	    		ImageView imgDep = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgDep);
	    		imgDep.setImageResource(R.drawable.list_icon_haltestelle);
	    		
	    		ImageView imgArr = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgArr);
	    		imgArr.setImageResource(R.drawable.list_icon_haltestelle);
	
	    		ImageView imgWrngs = (ImageView) convertView.findViewById(R.id.ivNTIi_ImgWarnings);
	    		imgWrngs.setImageResource(R.drawable.list_icon_warnings);
//            }
            return convertView;
        }
        @Override
        public int getChildrenCount(int groupPosition) {
            return children.get(groupPosition).size();
        }
        @Override
        public Object getGroup(int groupPosition) {
            return groups.get(groupPosition);
        }
        @Override
        public int getGroupCount() {
            return groups.size();
        }
        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                ViewGroup parent) {
        	Map mapGrp = (HashMap) getGroup(groupPosition);
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.navi_travel_info_group, null);
            }
            TextView depTime = (TextView) convertView.findViewById(R.id.tvNTIg_deptime);
            depTime.setText((CharSequence) mapGrp.get("departure_time"));

            TextView arrTime = (TextView) convertView.findViewById(R.id.tvNTIg_arrtime);
            arrTime.setText((CharSequence) mapGrp.get("arrival_time"));

            TextView trvlLines = (TextView) convertView.findViewById(R.id.tvNTIg_lines);
            trvlLines.setText((CharSequence) mapGrp.get("travel_lines"));
        
            LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(
                    wrapContent, wrapContent);
            lParams.setMargins(5, 5, 0, 0);

            LinearLayout imgsGroup = (LinearLayout) ((ViewGroup) convertView).findViewById(R.id.imgNTIg_ImgsGroup);
            imgsGroup.removeAllViews();

			for (Object actKey : mapGrp.keySet()) {
				if (((String) actKey).startsWith("vehicle_type")) {
					System.out.println("actKey = "+actKey);
					ImageView imgV = new ImageView(NaviTravelInfoAdapter.this);
					imgV.setImageResource((int) mapGrp.get(actKey));
					imgsGroup.addView(imgV, lParams);
				}
			}
            
            return convertView;
        }
        @Override
        public boolean hasStableIds() {
            return true;
        }
        @Override
        public boolean isChildSelectable(int arg0, int arg1) {
            return true;
        }
    }
}
A тут метод, который предоставляет "детей" адаптеру.

Код: Выделить всё

	public ArrayList<ArrayList<Map<String, Object>>> getTransitTravelStepsInfo() {

		ArrayList<Map<String, Object>> stepInfo = new ArrayList<Map<String,Object>>();

		ArrayList<ArrayList<Map<String, Object>>> allSteps = new ArrayList<ArrayList<Map<String,Object>>>();

		Map<String, Object> transitStepInfo = null;

		JSONArray steps = null;

		try {
			steps = response.getJSONArray("routes").getJSONObject(0)
					.getJSONArray("legs").getJSONObject(0)
					.getJSONArray("steps");
			for(int i = 0; i < steps.length(); i++) {
				String travel_mode =  steps.getJSONObject(i).getString("travel_mode");
				if (travel_mode.equals("WALKING")) {
					transitStepInfo = new HashMap<String, Object>();
					transitStepInfo.put("travel_mode", travel_mode);
					String html_instructions =  steps.getJSONObject(i).getString("html_instructions");
					transitStepInfo.put("html_instructions", html_instructions);
				}
				else if (travel_mode.equals("DRIVING")) {
					transitStepInfo = new HashMap<String, Object>();
					transitStepInfo.put("travel_mode", travel_mode);
				}
				else if (travel_mode.equals("TRANSIT")) {
					transitStepInfo = new HashMap<String, Object>();
					transitStepInfo.put("travel_mode", travel_mode);
					String arrival_time =  steps.getJSONObject(i).getJSONObject("transit_details").getJSONObject("arrival_time").getString("text");
					String departure_time =  steps.getJSONObject(i).getJSONObject("transit_details").getJSONObject("departure_time").getString("text");
					transitStepInfo.put("departure_time", departure_time);
					transitStepInfo.put("arrival_time", arrival_time);
					String departure_stop =  steps.getJSONObject(i).getJSONObject("transit_details").getJSONObject("departure_stop").getString("name");
					String arrival_stop =  steps.getJSONObject(i).getJSONObject("transit_details").getJSONObject("arrival_stop").getString("name");
					transitStepInfo.put("departure_stop", departure_stop);
					transitStepInfo.put("arrival_stop", arrival_stop);
					String headsign =  steps.getJSONObject(i).getJSONObject("transit_details").getString("headsign");
					transitStepInfo.put("headsign", headsign);
					String lineName = steps.getJSONObject(i).getJSONObject("transit_details").getJSONObject("line").getString("short_name");
					transitStepInfo.put("lineName", lineName);
				}
				stepInfo.add(transitStepInfo);
			}
			allSteps.add(stepInfo);

		} catch (JSONException e) {
			System.out.println("JASON_PARSER_<_getTransitTravelStepsInfo_>_ERROR");
			e.printStackTrace();
		}
		return allSteps;
	}
Да, и ещё. Если пытаюсь, в зависимости от типа поездки, использовать свой layout-файл для childView,

Код: Выделить всё

                if(tm == "WALKING")
                	convertView = infalInflater.inflate(R.layout.navi_travel_info_item_walking, null);
                else if(tm == "TRANSIT")
                        convertView = infalInflater.inflate(R.layout.navi_travel_info_item_transit, null);
то получаю ошибки типа "measure height of children"
Такое вообще возможно сделать в этом адаптере?

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Sebler » 07 май 2014, 08:13

Уже разобрался. Проблема была в if (convertView == null ) {}. Я тоже убрал его, как уже писали выше, и всё заработало.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 45. Список-дерево ExpandableListView

Сообщение klblk » 07 май 2014, 09:16

[syntax=java]if(tm == "WALKING")[/syntax]
не надо так...

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 07 май 2014, 19:10

Sebler писал(а):Уже разобрался. Проблема была в if (convertView == null ) {}. Я тоже убрал его, как уже писали выше, и всё заработало.
обратите внимание на ответ klblk
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Sebler » 09 май 2014, 17:40

Всех с праздником!
klblk писал(а):[syntax=java]if(tm == "WALKING")[/syntax]
не надо так...
А как надо? Если вы имеете в виду, что надо было писать tm.equals("WALKING") , то я так и писал по всему коду, но почему-то такая запись иногда работает, а иногда нет. Конкретно в этой активити она не работала, а в моём парзере работает. Читал где-то, что имеет смысл переопределить метод equals(). Но пока оставил всё как есть, т.е. где-то с equals, а где-то без него. Как говориться в одном анекдоте:
- "Работает?"
- "Работает"
- "Не трогай, пусть работает"

Если же вы что-то другое имели в виду, то озвучьте пожалуйста :)

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Leeroy » 09 май 2014, 19:46

Sebler писал(а):Всех с праздником!
klblk писал(а):[syntax=java]if(tm == "WALKING")[/syntax]
не надо так...
А как надо? Если вы имеете в виду, что надо было писать tm.equals("WALKING") , то я так и писал по всему коду, н......

Если же вы что-то другое имели в виду, то озвучьте пожалуйста :)
Если не переопределял equals() то вызывается Object.equals() а там

Код: Выделить всё

public boolean equals(Object o) {
        return this == o;
    }
if(tm == "WALKING") лучше конечно заменить и исключить NullPointerException на

Код: Выделить всё

if ("WALKING".equals(tm)) {
//do something
}
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Sebler » 10 май 2014, 01:57

Leeroy писал(а): if(tm == "WALKING") лучше конечно заменить и исключить NullPointerException на

Код: Выделить всё

if ("WALKING".equals(tm)) {
//do something
}
Т.е. по сути нужно писать не tm.equals("WALKING"), а "WALKING".equals(tm)? Я правильно понял?
А в методе иквалс вместо this подставляется то, что стоит перед иквалс? Т.е. если я пишу variable.equals("constant"), то вместо this имеем variable. Так?

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Leeroy » 10 май 2014, 07:03

Sebler писал(а):
Leeroy писал(а): if(tm == "WALKING") лучше конечно заменить и исключить NullPointerException на

Код: Выделить всё

if ("WALKING".equals(tm)) {
//do something
}
Т.е. по сути нужно писать не tm.equals("WALKING"), а "WALKING".equals(tm)? Я правильно понял?
А в методе иквалс вместо this подставляется то, что стоит перед иквалс? Т.е. если я пишу variable.equals("constant"), то вместо this имеем variable. Так?
да
вот тут можно глянуть http://skipy.ru/technics/objCompTh.html#eqeqvsequals
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Sebler » 15 май 2014, 20:53

Всем привет. Уже спросил в соседней теме, но там вряд ли ответят. Вставляю в ExpandableListView свою картинку для индикатора раскрытия группы, но он растягивается по всей высоте groupView. Ширину можно настроить методом setIndicatorBounds(). Что я и делаю, и положение и ширина индикатора меня устраивают. Но вот что делать с высотой?

Ответить