【AndroidでSkobblerを使う】Skobbler情報を表示する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

今回は【AndroidでSkobblerを使う】Skobbler情報の加工で取得したSkobblerのデータを画面に表示します。
仕様は下記のとおりです。

  1. 表示はリスト形式で行う。
  2. リストのアイテムをタップすると選んだ大陸/国/都市を親に持つ国/都市のリストに表示を切り替える。
  3. バックキーが押されたときに国/都市だった場合は大陸選択リストに表示を切り替える。
前回取得したデータは大陸/国/州/都市が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();
        }
    }
}

Androidゲームプログラミング A to Z

新品価格
¥4,968から
(2017/2/27 22:58時点)


AndroidエンジニアのためのモダンJava

新品価格
¥3,456から
(2017/2/27 23:01時点)


AndroidNDKネイティブプログラミング第2版

中古価格
¥1,893から
(2017/2/28 00:04時点)


Androidアプリ開発逆引きレシピ (PROGRAMMER’S RECiPE)

新品価格
¥3,024から
(2017/2/28 00:06時点)


Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

新品価格
¥3,240から
(2017/2/28 00:11時点)


アプリを作ろう! Android入門 Android Studio版 Android5対応

新品価格
¥2,160から
(2017/2/28 00:31時点)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)