3

ListViewの各行にユニークなOnClickListenerを登録する方が便利ですが、これが許容される方法であることを確認したいと思います。私のcurrent designは、それぞれの行のタイプからOnClickListenerの懸念事項を分離するために複雑な方法です。onItemClickListenerの代わりに各ListView行に対してonClickListenerを実装することには欠点がありますか?

これは、ListViewに複数のクラスの行があるためです。各クラスは全く異なる責任と行動を持っています。たとえば、サブカテゴリと書籍タイトルの両方を含むことができるListViewと考えてください。書籍のタイトルをクリックすると、カバー画像を示す新しいアクティビティが開始されます。サブカテゴリをクリックすると、ブックとカテゴリの新しいリストが表示されます。

onItemClickListenerの実装者が管理する各行についての知識を漏らさずに、行自体が独自のIDと責任に関する知識を維持したいと考えています。

私は、これを行うことのパフォーマンス上の意味と、クリックを処理する方法を理解するための独自のロジックの実装とが何であるかも知りたいと思います。

onItemClickListenerの代わりにListViewArrayAdapter行ごとにonClickListenerを実装することには欠点がありますか?私は具体的なデータ特定の欠点ではなく、曖昧な推奨事項を探しています。

メモリ使用初期化時間、またはが定常状態の速度(リストをスクロールするように)大きな影響を与えることを私は期待できますか?

答えて

5

各行ごとに個別のクリックリスナーが必要な理由については説明していませんが、推奨します。 View.setTag(Object)/View.getTag()を使用して、(共有)クリックリスナーのレスポンスをカスタマイズするための行固有のカスタムデータを渡してください。あなたの行に接続された異なるOnClickListener秒をしたい、なぜ私はあなたの例から見

EDIT

。私は、各行に別々のOnClickListenerインスタンスを必要としていたという印象を受けました。 (これが私の主な理由です)。2つのタイプの行(カテゴリとタイトル)と何百行もの行がある場合は、何種類かの応答しか必要としません。私はまた懸念を分けることのポイントを理解しています。

ListActivity.onListItemClick()(またはListActivityを使用していない場合はListView.setOnItemClickListener()を呼び出します)を上書きすると、リストビューの操作が妨げられなくなります。このためにデリゲートパターンを使用することができます。

public interface MyClickHandler { 
    public void onItemClick(ListView l, View v, int position, long id); 
} 

は、行データの各タイプ(行ごとにではない一例)のためにこのインタフェースを実装するオブジェクトの1つのインスタンスを作成する:

は、抽象クラスまたはインタフェースを定義します。アダプタでは、setTag(Object)を使用して、各行のタグを適切なMyClickHanderインスタンスに初期化します。ListActivity.onListItemClick()オーバーライドでは、このロジックを使用してください:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    Object tag = v.getTag(); 
    if (tag instanceof MyClickHandler) { 
     ((MyClickHandler) tag).onItemClick(l, v, position, id); 
    } else { 
     // default processing (if any) 
    } 
} 
+0

@glenviewjeff - 返信する回答を更新しました。 –

+0

+1と詳細な応答のためにTedさんに感謝します。 Android APIに、行ごとに1つのリスナに対して推奨することを正当化するデータや推奨事項がありますか、それとも何かの面白さに基づいていますか? –

+2

タグベースのソリューションで注意すべき点は、すべての 'getView()'/'bindView()'コールで確実にタグを更新することです。従来の「ビューホルダー」パターンでは、行が膨らんだときにのみタグが設定されますが、「ホルダー」はUIに関連付けられたもの(例:行のウィジェット)を保持するためです。ここで説明するパターンでは、モデルデータに結びついている物にタグを保持する必要があるため、位置ごとにタグが変更されます。それでも、行ごとに個別のクリックリスナーを使用することをお勧めします。 – CommonsWare

関連する問題