3 つのボタンを含むレイアウトである ListView があるとします。ユーザーが項目番号 5 の 2 番目のボタンなどをクリックしたことを効率的に知るにはどうすればよいですか?
また、2 番目の質問: その getView メソッドを使用するアダプターがある場合、アダプターではなくアクティビティ クラスでクリック イベントを処理するにはどうすればよいですか?
乾杯、
これを行うには、実際には多くの方法があります。
Button
クリックハンドラーに何をすべきかを伝えるコードにそれぞれをリンクするArrayListを構築できます...- Alexanderが言うように、ボタンを処理するListViewのカスタムアダプターを作成できます。このメソッドを使用する場合は、onClick ハンドラを
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// Create all the Views, Buttons, etc
// Create the click handlers:
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doButtonOneClickActions(position);
}
});
}
private void doButtonOneClickActions(int rowNumber) {
// Do the actions for Button one in row rowNumber (starts at zero)
}
どちらのソリューションを選択するかは、コードの残りの部分 (および好みのコーディング スタイル) によって異なります。
この目的のために、ListView
. 次にオーバーライドしますgetView
:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//here you define your button's click events.
//use position parameter to get actual position of current row layout in
// the list
}
私が今やっているように、あなたがリスト項目に 3 つのボタンを入れてくれたなんて、なんて素晴らしいことでしょう! 私もコーディング スタイルを探しています (必ずしも解決策ではありません)。とにかく、私は次のことを目指します。
クリック ハンドラーを外部インスタンスに委任します。外部インスタンスは、次を使用して定義され、アダプターに接続されます。
public class MyListAdapter extends BaseAdapter {
View.OnClickListener listener = null;
public View getView(...) {
buttonA.setOnClickListener(listener);
buttonB.setOnClickListener(listener);
buttonC.setOnClickListener(listener);
}
public void setItemClickListener(View.OnClickListener listener) {
this.listener = listener;
}
}
どのボタンがクリックされたかを識別するのは、リスナーの仕事です。MyListAdapter からリスナーにデータを渡したり、アプリケーション ロジックの一部としてリスナー コードを合理化したりするなど、さらに多くの問題に対処する必要があります。
カスタム アダプタとオーバーライドgetView(int position, View convertView, ViewGroup parent)
メソッドを作成し、そこでボタンを参照して設定する必要がありますonClickListeners
。そこにposition
はリスト行があり、必要なものがすべて揃っています。