Re: Урок 45. Список-дерево ExpandableListView
Добавлено: 17 ноя 2013, 18:07
Нет. Я название неправильно прочитал или вы не правильно написали (кастомный иерархический вью)Foenix писал(а):вы хотите, чтоб я за вас почитала всю ветку?
Добро пожаловать на форум сайта
http://forum.startandroid.ru/
Нет. Я название неправильно прочитал или вы не правильно написали (кастомный иерархический вью)Foenix писал(а):вы хотите, чтоб я за вас почитала всю ветку?
Огромное спасибоFoenix писал(а):Кстати, и обычный ExpandableListView можно кастомизировать, вроде бы с картинками. Вот за полсекунды нагуглилось
http://imobiledevelopment.blogspot.ru/2 ... droid.html
http://learnandroideasily.blogspot.ru/2 ... ample.html
Код: Выделить всё
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;
}
}
}
Код: Выделить всё
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;
}
}
}
Код: Выделить всё
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;
}
Код: Выделить всё
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);
обратите внимание на ответ klblkSebler писал(а):Уже разобрался. Проблема была в if (convertView == null ) {}. Я тоже убрал его, как уже писали выше, и всё заработало.
А как надо? Если вы имеете в виду, что надо было писать tm.equals("WALKING") , то я так и писал по всему коду, но почему-то такая запись иногда работает, а иногда нет. Конкретно в этой активити она не работала, а в моём парзере работает. Читал где-то, что имеет смысл переопределить метод equals(). Но пока оставил всё как есть, т.е. где-то с equals, а где-то без него. Как говориться в одном анекдоте:klblk писал(а):[syntax=java]if(tm == "WALKING")[/syntax]
не надо так...
Если не переопределял equals() то вызывается Object.equals() а тамSebler писал(а):Всех с праздником!
А как надо? Если вы имеете в виду, что надо было писать tm.equals("WALKING") , то я так и писал по всему коду, н......klblk писал(а):[syntax=java]if(tm == "WALKING")[/syntax]
не надо так...
Если же вы что-то другое имели в виду, то озвучьте пожалуйста
Код: Выделить всё
public boolean equals(Object o) {
return this == o;
}
Код: Выделить всё
if ("WALKING".equals(tm)) {
//do something
}
Т.е. по сути нужно писать не tm.equals("WALKING"), а "WALKING".equals(tm)? Я правильно понял?Leeroy писал(а): if(tm == "WALKING") лучше конечно заменить и исключить NullPointerException наКод: Выделить всё
if ("WALKING".equals(tm)) { //do something }
даSebler писал(а):Т.е. по сути нужно писать не tm.equals("WALKING"), а "WALKING".equals(tm)? Я правильно понял?Leeroy писал(а): if(tm == "WALKING") лучше конечно заменить и исключить NullPointerException наКод: Выделить всё
if ("WALKING".equals(tm)) { //do something }
А в методе иквалс вместо this подставляется то, что стоит перед иквалс? Т.е. если я пишу variable.equals("constant"), то вместо this имеем variable. Так?