ListViewAdapterではまった・・・positionが0のまま・・・
毎回のようにはまってしまう。androidでListViewというリスト形式のものを表示する場合は、ListViewAdapterという便利なものがある。List形式のものを渡せば、表示してくれて件数が多いと自動的にスクロールする機能まで付加してくれる。
使わない手はない。
難しいコードはないのだけど、はまってしまった。
ArrayAdapterを継承したカスタムクラスを作成し、以下のコード内でリストを表示する。
@Override public View getView(int position, View convertView, ViewGroup parent) { CustomData item = (CustomData) getItem(position); if (null == convertView) { convertView = layoutInflater_.inflate(R.layout.listdata, null); }
CustomDataも独自クラスで、このクラスを使うことで色々な形式のデータを使うことができる。ArrayListとかでもいいけど、CustomDataクラスを作ることで、画像(アイコン)や文字などを一緒に使うことができる。
実行する側の処理も書いて、実行してみると1行しか表示されない・・・ここから色々とデータを確認する。
そもそも、渡しているデータが1行なのか?渡している形式が問題なのか???
など問題となりそうな事を想定して、実行中のデータなどを確認してみても、データがちゃんと数件分渡っている。データが確認できるということは、形式の問題でもない。
なんだろう・・・・
実行中の状態で確認すると、positionがずっと0のままで変化しないのだ。それでは、1件しか表示されないわけだ。本来は、データの件数に応じて、0から加算されないといけない。
問題なのは、getViewメソッド内のpositionの値。
ではやはり、受け取ったデータの件数が少ないのか?そこで、getcount()とメソッドで件数がちゃんと認識できているのか確認するとちゃんとデータ件数の数字と合っていた。
「わけわかめ・・・」となって、ネットで検索してみると、ListViewの表示側の問題という内容が。
つまり、コードの中の話ではなく、レイアウトを形成しているxmlファイルのほうだと。表示サイズが最小だと表示できないとかなんとか。
そこで、レイアウトファイルを変更して、最大と指定すると・・・表示された・・・
なんだかなー・・・件数分を取得して、表示が1行分しかないとかなら理解できるけど、データも取得できないって・・・わからん。
実際には、Activity ==> TabLayout ==> PagerAdapter ==> FragmentManager ==> Fragment ==> ListView ==> ListViewAdapter という形で表示する。
Activityで取得したデータをListに表示するだけで、これだけデータの受け渡しが発生してしまう。
ここでも、色々と時間がかかってしまったで、後日まとめよう・・・
RIZIN横浜大会の感想と興行の難しさ・・・
RIZINの横浜大会を見ましたが、色々と考えさせられました。というのも、今回の試合で「那須川天心」「堀口恭司」「RENA」の内容と見ると、とても練習だけでは得ることができないくらいのレベルを感じてしまった。
那須川天心選手は、打撃が主体の選手というか・・・MMAはまだ3戦目ですが、とにかく打撃だけで圧倒できる選手。
本当に、100年に1人の逸材だと思う。そもそも、ムエタイのチャンピオンクラス2人にKO勝ちしている時点でレベルが凄すぎる。
小さい頃からやっているから技術的なものもあると思うけど、ムエタイの選手だって小さい頃からやってます。
それでも、違うのは練習量と言いたいところですが、あの強さはやはり「天性のもの」だとしか言えません。
堀口恭司選手は、伝統派空手の出身です。あの独特のステップと飛び込みの速さは伝統派スタイルです。でも、シャドーをみる限りはボクシングテクニックもしっかり持っています。驚いたのが、とにかく身体能力の高さ。
マウントになるような状態で、相手の元谷選手を足に乗っけてそのまま飛ばしましたから。
そういうシーンが何度かありましたから、とにかく力が強いんですね。
反応も早いし。RENA選手もそうなんですが、反応が早い。
相手の動きに対して、素早く対応して危険な状態になる前に動いています。いや、それはみんなわかっているんです。
それがなかなか試合の中ではできないし、わからない。技が決まる頃にしか反応できない。
その前に動けるのが、凄い選手なんですが、3人とも凄かった。
毎日8時間練習して10年経っても、きっとあの領域までは行かないでしょう。いや、8時間も練習したら体のほうが先に壊れます。
それよりも心配になったのが興行としてのRIZIN。今までも沢山のイベントが出てきて、途中で消滅しました。
理由は簡単で、選手が有名になればファイトマネーも高くなる。勝ち続けると有名になるけど、対戦相手がいない。いても、有名で強い選手になるので、またファイトマネーが高くなる。
試合も厳しい内容になるので、定期的な興行も難しくなる。大体、3ヶ月1回くらいのペースですよね。
会場も大きくなるので、設備も大変だし設営のために前日、前々日から借りたりしないといけない。チケットは高くなるので人を埋めるのも大変・・・
いつも、こういうパターン。
しかし、相撲、プロレス、ムエタイ(タイで開催されている試合の場合)は、連日試合をしています。相撲も、13日連続でやります。
プロレスも連日行えます。なので、収入のペースが全然違います。
ムエタイも、タイでは賭けの対象で、毎日のように行われています。選手層が違うというのもありますが、賭けムエタイの場合は、判定での勝ちを最上とするので、無理にKOを狙いに行きません。
4Rまでどちらが勝つかわからない内容で、賭けもヒートアップ。5Rになって、ヒザやミドルの応酬で盛り上がって、判定で賭けた選手が勝つ。そういうのが、盛り上がるいい試合です。
1RからKOを狙うようでは、全く盛り上がらないし結果が見えてしまうと賭けるほうもつまらない。
ミドル、ヒザがポイントが高く、パンチは倒さない限りはポイントにならない。そういう仕組みもムエタイを盛り上げる仕組みだと思います。
日本での興行の場合は、判定よりKO決着を好むので、みんなKO狙いでいきます。結果、選手がみんな怪我だらけで試合が組めない。なんて事も多い。
RIZINも、ちょっと心配です。
韓国版「仁」は、ストーリーがね・・・
「仁」と言えば、数年前に放送され、ストーリーがおもしろくて、再放送含めて見ていましたが、韓国でもリメイクされて「DrJIN」として放送されていたようです。再放送を見ていると、韓国版だけど、本家のストーリーをうまく李氏朝鮮時代にあてはめています。
仁でも幕末の激動の時代だったのですが、韓国版でも李氏朝鮮の終わりの時期となっています。大まかなストーリーとしては、現代の医師がタイムスリップして、昔の時代で現代の医療技術で人々を救うという内容なのですが、時代を変えてしまうというジレンマと人を助けたいという気持ちの葛藤が常にあります。
日本版では、幕末という時期でもあり、とにかく色々な登場人物が出てきます。「坂本竜馬」との関係をメインに歴史好きなら知っているメンバーが登場します。幕臣として勝海舟。薩摩藩士として、西郷、大久保。幕末なので、朝廷勢力と幕府勢力の争いに、薩摩、長州。更に、土佐藩など諸藩も絡んできます。医師の中でも、東洋と西洋の争いがあり、その関係にも巻き込まれてしまいます。
色々な勢力と登場人物が登場し、はっきり言って歴史を知らないと厳しい部分もあるのですが・・・
あの時代の朝廷と幕府の関係というのも、説明するのが難しいですから、その時点で複雑で藩まで絡んでくれば難しいのは当然で。
ところが、韓国版ドクタージンの場合は、簡単で朝廷勢力を「安東金氏」が牛耳っていて、王族であるイ・ハウンが対抗して、息子を王座に据えて興宣大院君と呼ばれ、息子は高宗となるという比較的わかりやすい。登場人物が・・・あんまり出てこない。というか、李氏朝鮮の場合は、王族と重臣くらいしか出てこない。地方から優秀な人物が・・・というのがほとんどない。
それと比較すると、日本の場合は各藩に優秀な人材がいたように思える。幕府側でも小栗上野介や勝海舟。松平容保も幕府側として、最後まで戦った。薩摩、長州については、沢山いるけど、これはその後の政権を担ったからだと思う。この時代に登場させようと思ったら沢山いすぎて困るくらい。
ちなみに「高宗」が最後の李氏朝鮮の王となる。国内の勢力争いに、清の軍隊を呼んで解決させたり・・・その対抗勢力は、日本から軍隊を呼ぶという事で、国内の勢力争いが他国間の戦争のきっかけとなってしまう。この時代だけでなく、李氏朝鮮時代を通して、国内の対抗勢力が明や清の軍隊を呼ぼうとするのはいつものこと・・・
豊臣秀吉が攻め込んできた時には、宣祖は都から逃げ出して明に助けを求めている。戦略上、体制が整わないとか戦力的に厳しい場合は逃げるのは問題ないのだけど、都の場合はちと違う。首都が陥落するというのは、政治機能が麻痺するか相手側に渡ってしまうので、反抗作戦も厳しくなる。とにかく、首都だけは死守するというのが当然だと考えるのだが・・・
江戸幕府も江戸城を無血開城したのだけど、これは「国内勢力」同士の争いだったので、首都が戦場になるのを避けたということだし、幕府としては降参している。
他国の勢力に首都を渡すのは、いつの時代でも全兵力を投入しても防がないとまずい。
そういえば、朝鮮戦争も同じような構図。まずは、北朝鮮軍が南下。対抗できずに、釜山近くまで後退してしまう。そこで、アメリカ軍を主体とする連合軍が加勢する。38度線を超えなければいいものを当時の韓国大統領は、この機会にということで38度線を越えての軍事作戦を匂わせる。38度線を越えてしまうと、今度は中国が脅威と捉え、中国が参戦・・・という感じで、いつも自国の勢力争いに他国が被害を受けてしまう。
自分の持っている才能はあるのか???
ブログを書いていても、普段に行っていることも、無意味に思えてしまうことは多々ある。
ブログの内容を色々と考えて書いたり、見やすいように考えて書いても、意味があるのかわからない・・・と感じることは多々ある。
普段行っていることも、「意味があるのだろうか?」と考えてしまう。
自分がやっていることで、「何かの役にたっている」と実感している人はどのくらいいるのだろうか?
自分がやらなくても、誰かが代わりにやるのではないだろうか?
ブログなんて書かなくても、別にいいじゃないだろうか?
こういう気持ちになる時は、その前にやる気があって色々とやった後に襲ってくる場合が多い。やっている時は、あれもしてみようとか・・・これも変更してみようとか。
そうやってやったことに対して、何も変化が感じられない時に、反動で「自分のやっていることなんて無意味」だと感じてしまう。
そもそも、これまでやってきたことも無意味だったのではないか?
自分の持っている才能や力なんて、世の中では必要とされていないのではないだろうか?
それでも、人より少しでも優れた部分があるならば使わないといけないのだろう。それは、自分の努力もあるし、元々の与えられた力かもしれない。
元々、力の強い人や知恵のある人、器用や人、物を作るのが上手い人、絵を描くのが上手い人。
そういう人は、与えられた力だとしたら、その力を自分だけに使うのではなく、他の人の力になり、力の強い人は力の弱い人を助けたり、知恵のある人は、知恵が思いつかない人に知恵をかして、与えられた力というものを、使うことが本命なのかも知れない。
自分には、なんの力や才能があるのだろうか?
ネットの情報は嘘だらけというけども・・・空城の計
テレビの討論番組などでたまに「ネットでの情報は信用できない」という感じの発言を聞くことがある。どの部分の事を言っているのかわからないけども、テレビの情報も酷いものだと感じた。
テレビの歴史番組で徳川家康の三方原の戦いについての番組で、その中で家康が使ったとされる「空城の計」については三国志演義で登場する「諸葛亮孔明」が使った策として紹介され、家康もこの故事から知っていて使ったと解説されていた。
三国志演義という時点で、そもそも創作感が強いし、家康の使った計も創作というのが最近は言われている。家康も当然知っていただろうし、実際に「空城の計」は使われているので、当然知識としては知っていたと想像できる。
問題なのは、三国志演義の部分で魏の司馬懿仲達が蜀に攻め入り、軍師の孔明と戦い、兵士の少ない孔明が使ったと解説されていた・・・いや、違いすぎる。
家康の例でも、家康から甲斐に攻め込んだ・・・という話になったら変だ。三方原で、家康と武田信玄が戦い、家康が大敗したという事実は変えてはダメで、そのあとで空城の計を使おうが何をしようが「家康が生き残った」のは事実だから問題ない。多少の創作は・・・と思う。
ただ、三国志の話では蜀の孔明のほうから「北伐」として、魏に攻め込んでいる。逆なんだよね・・・そして、魏に進撃していた蜀が要害として重要な街亭という場所を信頼し期待していた「馬謖」に守らせる。方法も指示をして、重要な場所ということも念を押して、副将もつけて行かせた。
ところが、馬謖は街亭の道に関所を作らずに山頂に部隊を配置し、それを見た魏軍は山を囲み、水を絶ち弱らせたところを撃退した。
街亭を取られたことで、全軍を撤退させることにした。その際に、少数の兵と食料を取りに行った際に、魏の司馬懿仲達が率いる部隊が城の近くに現れて、「空城の計」を使うことになる。
つまり、蜀の孔明が魏に攻め込む -> 街亭を取られる -> やばいので逃げる -> 食料を取りにいく -> 敵と遭遇 -> 空城の計 という流れに。
ちなみに、「泣いて馬謖を切る」という諺も、このあとの戦後処理で、街亭を守れなかった馬謖を切った事から諺になっている。
それだけ、馬謖に期待して信頼していた証でもある。
芸能人を格付けする番組では、「干支」の12支についての問題だった。「和」に関する知識ということだったけど、いや、これも違う。そもそも、12支は「動物じゃない」。
中国で使われていた方角や時間などを表すもので、占いでも必ず出てくる。10の干に、12の支を組み合わせて年や月、日を表したりする。
今年は、丁酉年。
10と12の組み合わせなので、60で同じ干支の組み合わせとなる。これが「還暦」で、産まれた年と同じ干支になる。
和と言いながら、全然使われていない。うーん・・・どうなんだろう。
AndroidStudioでのエラー色々
バージョン関係の問題は、終わったと思っていたのだけど、まだまだ続く。
JDKを1.8に変更したことに関係してのエラーから。
JDK1.8にアップしたのはいいけど、最新ではないからアップデートしてと言われる。実行しようとしても、エラーになるので調べてみると、前のバージョンが残っていることが関係しているっぽい。
そこで、前のバージョンのアンインストールから行ってみる。
アンインストールを行ってみると、アップデートが可能になった。これで、大丈夫・・・
ところがAndrodStudioが起動しない。エラー内容としては「JAVA_HOME」変えてないだろ?というお怒りだった。
PATHの設定は、変更したはずなのだが・・・「JAVA_HOME」の設定もあったか・・・
コントロールパネルからシステムメンテナンス=>システム=>システムの詳細設定=>環境変数=>JAVA_HOMEの指定を新しいJDKのフォルダに変更する。
AndroidStudioもこれで起動できたので、テストを行うために実行してみると・・・またエラー・・・
エラー内容は、
Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\Program Files\Java\jdk1.8.0_121\bin\java.exe'' finished with non-zero exit value 1
調べてみると、ライブラリが多すぎてあきまへん!!!ということらしい。我がままだな・・・
build.gradle(app:Module)のライブラリの部分を変更。
サポートライブラリが多いようなのでv4をコメントアウトしてみる。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.google.android.gms:play-services:8.3.0' compile 'com.squareup.okhttp3:okhttp:3.6.0' //compile 'com.android.support:support-v4:25.2.0' <==コメントアウトしてみた compile 'com.android.support:support-v13:25.2.0' compile 'com.android.support:design:24.2.0' }
これで、実行できた。やっと、タブの実装まで可能になった。
64K を超えるメソッドを使用するアプリの設定 | Android Studio
別の対処方法もあるようなので、貼っておこう
AndroidStudioのバージョンをあげたらファイルをcompileできなくなった | グロースハックする?
ただ・・・タブで表示されている内容を変更するのだけど、どうしたものか・・・
Activityで使っているようなfindViewByIdでIdを指定すればいいという感じでもない。
TabLayout => ViewPager => ViewPagerAdapter => FragmentManager => Fragment
という多重構想になっている。更に・・・Fragment上でListViewも使うので、ListViewAdapterも使う。
もう、なんだか訳わからん・・・
TabLayout => ViewPager => ViewPagerAdapter => FragmentManager => Fragment => ListView => ListViewAdapter => ArrayList
AndroidStudioで色々とはまったので、まとめてみる。自己ログ
androidStudioで色々とはまってしまった。WEB上の情報も色々と見たのだけど、まとめておかないと後で大変そうだったので自己ログ。
事の始まり
メインのActivityから遷移して、次のActivityに移った時に、タブ付の表示にしてみることにした。
タブの配置にするには「TabHost」を使う方法があるのだけど、新しいAPIでは推奨されていない。「TabLayout」を使い「ViewPager」と「ViewPagerAdapter」で実現する方法がいいと。
Activity遷移イメージ
ActivityとViewPagerAdapterなどの関連図
まずは、タブを実装するActivityのレイアウトファイルに、TabLayoutとViewPagerを追加
<android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" />
ViewPagerAdapterを使うために新しくクラスを作成し、FragmentPagerAdapterを継承する。
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment = null; switch (position) { case 0: fragment = rentFragment.newInstance("rent"); break; case 1: fragment = srvFragment.newInstance("srv"); break; default: break; } return fragment; } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { CharSequence charSequence = null; switch (position) { case 0: charSequence = "貸出"; break; case 1: charSequence = "予約"; break; default:break; } return charSequence; } }
次に、タブを追加するクラスにタブのレイアウトなどを追加する。
TabLayout tabLayout = (TabLayout)findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab()); tabLayout.addTab(tabLayout.newTab()); ViewPager viewPager = (ViewPager)findViewById(R.id.view_pager); viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager())); tabLayout.setupWithViewPager(viewPager);
タブレイアウトを追加し、ViewPagerにはViewPagerAdapterもセットする。
タブレイアウトに、ViewPagerを関連付けてタブとViewPagerが連動するようになる。
次に、タブとして表示されるFragmentを用意する必要がある。ここでは、rentFragmentとsrvFragmentとして指定してある。
Fragmentを作成するには、右クリック->Fragment->Fragment(Blank) で作成することができる。
XMLファイルも同時に作られるので、名前を指定すれば別々に用意する必要はない。
ただ、要らないメソッドとかがあるので、修正をしないと動かない。ちと面倒だけど一から作るよりはいい。
まずは、表示だけのテストを行いたいので、基本のFragmentだけあればいい。ところが・・・getSupportFragmentManager()が赤くなりエラーになっている。エラー内容をみる限り、そんなメソッドねえよということらしい。
Activityではなく、v7.app.AppCompatActivityを使えということで、importに追加
import android.support.v7.app.AppCompatActivity;
さらに継承の指定を、ActivityからAppCompatActivityに変更する必要がある。ここで、エラーがなくなりBuildできるようなったので、テストしてみる。
不明なエラー
ここからが実際の迷走の始まり。実行したところで、Activityが表示される時にアプリが落ちてしまう。エラーを見ると、以下の文でエラーになっているように見える。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
ここのsuper.onCreate(savedInstanceState);でエラーになるというのだけど、Activityが表示される際にonCreateが呼ばれる。その最初の1行目なので定型のようなもの。何も実行されていない。おかしい・・・
ネットで調べてみても、なかなか情報がない。AppCompatActivityが問題だというのはあるけど、解決策はActivityに変更するという方法ばかり、これではViewPagerが使えない。
海外のサイトでは、バージョンの話がされている。バージョンね・・・
AndroidStudioのバージョン関連
バージョンと言っても、沢山存在する・・・まずは、AndroidStudioのバージョン。それから、AndroidStudioは、Gradleの上で動作しているのでGradleのバージョンとBuiledバージョンも存在する。さらに、Androidプラグインバージョンも存在する。
さらに・・・APIのバージョン。コンパイルバージョン、supportライブラリのバージョン・・・
なんなんだ・・・
まずは、GradleとAndroidプラグインバージョンを調べてみる。File->ProjectStructureで表示される画面で確認できる
これは、変更された数字で、変更前はGradle2.2.1 androidプラグイン1.2.3という数字だった。この画面でも変更が出来る。海外のサイトの情報では、プラグインを2以上にしないとダメということ。単純に2以上を指定してもエラーになる。
Buildすらされなくなってしまう。
Gradleのバージョンもサイトを見る限り新しいバージョンがあるようなのだが・・・
https://jcenter.bintray.com/com/android/tools/build/gradle/
バージョンを変えてみたり、サイトで動いたバージョンなどを指定してもダメ。ここで、かなり時間をとられた。
バージョンについては、以下のサイトを見ないとダメだった・・・
Android Plugin for Gradle Release Notes | Android Studio
プラグインバージョンと関連するGradleバージョンも書かれているので、これに従ってバージョンを指定する。
Gradle2.13 androidプラグイン2.1.2という数字で落ち着いた。
これだけでは済まなかった。次に見ないといけないのは、コンパイルなどのバージョン。
GradleScriptsの中のbuile.gradle(Module:app)の内容を確認する。
android { compileSdkVersion 25 buildToolsVersion "24.0.3" defaultConfig { applicationId "????" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" }
minSdkVersionは、14以上を指定する必要があるとか、元々15に指定していた。compileSdkVersionは、25と新しいバージョンを指定。buildToolsVersionが問題のようで、ここを変更した。v7.app.AppCompatActivityを使うには、API24.2.0より上という情報があったので、24.0.3を指定。
色々とバージョンを変更してみるとBuildが通るようになった。エラーもなくなったので、なんとか動くようだ。
実際には、supportライブラリーのバージョンも関係するのかもしれない。一応コピペ。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.google.android.gms:play-services:8.3.0' compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.android.support:support-v4:25.2.0' compile 'com.android.support:support-v13:25.2.0' compile 'com.android.support:design:24.2.0' }
okhttp3は、http通信用なので通信しない場合は、必要なし。
さて、テストを実行してみると、エラーになってしまった・・・
エラー内容は・・・
JDKを1.8にしろと・・・
はい、すみません。してませんでした・・・
テストの再実行・・・・・・あっさり動いた・・・なんだったんだ・・・
でも、表示だけなので、Fragmentの中身を実装しないと。
AppCompatActivityを使うだけで、こんなに大変だとは。AndroidStudioに関係するバージョンは、上げてしまうと今まで作成してプロジェクトがエラーになってしまうので、意識的に変えていなかった。これで、関係性がわかったけど、APIのバージョンを上げると、使っていたメソッドが非推奨になっていたりするので、大変なのだ。なんとかならんのかな~。