今回は【AndroidでSkobblerを使う】Skobbler情報の加工で取得したSkobblerのデータを画面に表示します。
仕様は下記のとおりです。
- 表示はリスト形式で行う。
- リストのアイテムをタップすると選んだ大陸/国/都市を親に持つ国/都市のリストに表示を切り替える。
- バックキーが押されたときに国/都市だった場合は大陸選択リストに表示を切り替える。
前回取得したデータは大陸/国/州/都市がArrayListとしてフラットに並んでいる状態です。
このままでは使いにくいので、大陸/国/州/都市毎にHashMapに振り分けます。
さらに、ActivityにListViewを追加し、SkobblerDataをリスト表示するためのSkobblerDataListAdapterを作成します。
まずは、SkobblerDataListAdapterのコードです。
public class SkobblerDataListAdapter extends ArrayAdapter<SkobblerData> {
private final static int LAYOUT_ID = 0;
public SkobblerDataListAdapter(Context context, List<SkobblerData> objects) {
super(context, LAYOUT_ID, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
PlaceHolder placeHolder;
if (convertView == null) {
placeHolder = new PlaceHolder();
placeHolder.nameTextView = new TextView(getContext());
placeHolder.nameTextView.setTextColor(Color.BLACK);
placeHolder.nameTextView.setTextSize(30);
convertView = placeHolder.nameTextView;
convertView.setTag(placeHolder);
} else {
placeHolder = (PlaceHolder) convertView.getTag();
}
SkobblerData item = getItem(position);
placeHolder.nameTextView.setText(item.getName());
return convertView;
}
static class PlaceHolder{
TextView nameTextView;
}
}
続いてActivityのコードです。
public class DownloadActivity extends AppCompatActivity {
private static final int LOADER_ID = 1000;
private String mapResourcesDirPath;
private HashMap<String, ArrayList<SkobblerData>> worldHashMap;
private ListView countryListView;
private String nowSubtype = SkobblerData.SUBTYPE_CONTINENT;
private String nowParentCode = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download);
mapResourcesDirPath = getFilesDir().getPath() + "/" + "SKMaps/";
if (!new File(mapResourcesDirPath).exists()) {
new SKPrepareMapTextureThread(this, mapResourcesDirPath, "SKMaps.zip", new SKPrepareMapTextureListener() {
@Override
public void onMapTexturesPrepared(boolean b) {
if (b) {
initMapSetting();
getLoaderManager().restartLoader(LOADER_ID, new Bundle(), mLoaderCallbacks);
}
}
}).start();
} else {
initMapSetting();
getLoaderManager().restartLoader(LOADER_ID, new Bundle(), mLoaderCallbacks);
}
countryListView = (ListView) findViewById(R.id.country_info_list_view);
countryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SkobblerData skobblerData = (SkobblerData) parent.getItemAtPosition(position);
if (SkobblerData.SUBTYPE_CONTINENT.equals(skobblerData.getSubType())) {
nowSubtype = SkobblerData.SUBTYPE_COUNTRY;
nowParentCode = skobblerData.getCode();
} else if (SkobblerData.SUBTYPE_COUNTRY.equals(skobblerData.getSubType())) {
if ("US".equals(skobblerData.getCode())) {
nowSubtype = SkobblerData.SUBTYPE_STATE;
nowParentCode = skobblerData.getCode();
} else {
nowSubtype = SkobblerData.SUBTYPE_CITY;
nowParentCode = skobblerData.getCode();
}
} else if (SkobblerData.SUBTYPE_STATE.equals(skobblerData.getSubType())) {
nowSubtype = SkobblerData.SUBTYPE_CITY;
nowParentCode = skobblerData.getCode();
} else {
return;
}
refreshListView();
}
});
}
private void initMapSetting() {
SKMapsInitSettings initMapSettings = new SKMapsInitSettings();
initMapSettings.setMapResourcesPaths(mapResourcesDirPath,
new SKMapViewStyle(mapResourcesDirPath + "daystyle/", "daystyle.json"));
final SKAdvisorSettings advisorSettings = initMapSettings.getAdvisorSettings();
advisorSettings.setAdvisorConfigPath(mapResourcesDirPath + "Advisor");
advisorSettings.setResourcePath(mapResourcesDirPath + "Advisor/Languages");
advisorSettings.setLanguage(SKAdvisorSettings.SKAdvisorLanguage.LANGUAGE_EN);
advisorSettings.setAdvisorVoice("en");
initMapSettings.setAdvisorSettings(advisorSettings);
SKMaps.getInstance().initializeSKMaps(this, initMapSettings);
}
public LoaderManager.LoaderCallbacks<ArrayList<SkobblerData>> mLoaderCallbacks = new LoaderManager.LoaderCallbacks<ArrayList<SkobblerData>>() {
@Override
public Loader<ArrayList<SkobblerData>> onCreateLoader(int id, Bundle args) {
return new SkobblerMapInfoDownloadLoader(getApplicationContext());
}
@Override
public void onLoadFinished(Loader<ArrayList<SkobblerData>> loader, ArrayList<SkobblerData> data) {
Log.d("you", "onLoadFinished");
if (data != null) {
//前回取得したデータは大陸/国/州/都市がArrayListとしてフラットに並んでいる状態です。
//このままでは使いにくいので、大陸/国/州/都市毎にHashMapに振り分けます。
worldHashMap = new HashMap<>();
for (SkobblerData skobblerData : data) {
String subType = skobblerData.getSubType();
if (!worldHashMap.containsKey(subType)) {
worldHashMap.put(subType, new ArrayList<SkobblerData>());
}
worldHashMap.get(subType).add(skobblerData);
}
refreshListView();
}
}
@Override
public void onLoaderReset(Loader<ArrayList<SkobblerData>> loader) {
}
};
/**
* ListViewを更新
*/
private void refreshListView() {
if (SkobblerData.SUBTYPE_CONTINENT.equals(nowSubtype)) {
//大陸を選択する
SkobblerDataListAdapter skobblerDataListAdapter = new SkobblerDataListAdapter(getApplicationContext(), worldHashMap.get(nowSubtype));
countryListView.setAdapter(skobblerDataListAdapter);
} else {
ArrayList<SkobblerData> skobblerDatas = worldHashMap.get(nowSubtype);
ArrayList<SkobblerData> childSkobblerDatas = new ArrayList<>();
for (SkobblerData skobblerData : skobblerDatas) {
if (skobblerData.getParentCode().equals(nowParentCode)) {
childSkobblerDatas.add(skobblerData);
}
}
SkobblerDataListAdapter skobblerDataListAdapter = new SkobblerDataListAdapter(getApplicationContext(), childSkobblerDatas);
countryListView.setAdapter(skobblerDataListAdapter);
}
}
@Override
public void onBackPressed() {
if (SkobblerData.SUBTYPE_CONTINENT.equals(nowSubtype)) {
super.onBackPressed();
} else {
nowSubtype = SkobblerData.SUBTYPE_CONTINENT;
refreshListView();
}
}
}