ListViewのOnItemClickListener反応しな過ぎ問題

Androidアプリを開発中、詰まったところを忘備録としてまとめます。

今回はListViewで表示した各要素タップで何かしら処理をさせる手段についてです。

 

そもそもの発端は

「ListViewで表示した要素タップして画面遷移したい!」

 という欲求があったから。

 

が、いろいろ調べつつ実装しても、表示された要素をタップしたところでウンともスンとも言わないという……!

みんな嘘つきじゃないか……!

 

疑心暗鬼に陥りかけつつさんざん四苦八苦した挙げ句、次のような結論に至りました。

 

 ListViewで表示された要素内にonClickListenerで反応する要素が存在すると、OnItemClickListenerが反応しなくなる

 

要素内にButtonなどを配置していると、いくらListView要素をタップしたところでOnItemClickListenerが食われてしまうようです。

(この情報になかなか辿り着けなかった……)

 

以下、実装

public class SampleListViewActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //ListView用のレイアウトを設定
        setContentView(R.layout.sample_list_view);

        SampleListAdapter adapter = new SampleListAdapter(getApplicationContext());
        adapter.add(/*ここで任意のデータをadapterに渡す*/);
        
        listView = (ListView) findViewById(R.id.listView);
        //adaperをセット
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

        //ココであんな事やこんな事をさせる
    }
}

※Adapter等の使い方はグーグル先生に訊いて下さい

 

結局、ネット各所であらゆる方々が掲載しているサンプル通りに実装すれば、普通に動くよね、っていう。

疑って本当にすまんかった。

 

 では、今回何故こんなミスをしたのか?

そもそもListViewの要素をタップしてイロイロ処理をさせたいと思うまでに、以下のようなプロセスがありました。

  1. ListViewの要素にButton配置して、Button押されたらダイアログ表示して何かいろいろしたいなぁ
  2. ダイアログ表示するにはFragment使うんやろ!オイラ詳しいんだぞ!
  3. Fragmentよく分からん……どうやっても上手くいかん……
  4. よっしゃ、Button押下じゃなくて、ListViewタップでActivityを遷移して、遷移先でいろいろやったろ!(諦め)
  5. 上記のButtonを残したまま)サンプル通り実装しても何も動かん……皆嘘つきや……

その後、ButtonにOnItemClickListenerが食われてる説が急浮上し、いらない処理を消してみたらアラフシギ!

 横着はいけないね、というだけの話でした(死)

 


という感じで今回の忘備録は終了です。

千悠は アプリ開発ペーペーのクソ雑魚なのでこんな凡ミスをしましたが、もし万が一にも似たようなところで詰まっている方がいれば、少しでも力になれればと、つらつら書いてみました。

記事内でよく分からない部分があれば、恐らく千悠もよく分かってないのでグーグル先生に訊いて下さい。

ではでは、今回はこの辺で。