リストビューのカスタムアダプター内で選択したアイテムの値を取得しようとします。私はこれを次のコードで試します:
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
View curr = parent.getChildAt((int) id);
TextView c = (TextView)curr.findViewById(R.id.tvPopUpItem);
String playerChanged = c.getText().toString();
Toast.makeText(Settings.this,playerChanged, Toast.LENGTH_SHORT).show();
}
最初はクリックすると値は適切ですが、スクロールして別のアイテムをクリックすると、クリックしたアイテムの誤った値が表示されます...これの原因は何ですか?
パラメータv
は現在の行です。だから使う:
_public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
TextView c = (TextView) v.findViewById(R.id.tvPopUpItem);
String playerChanged = c.getText().toString();
Toast.makeText(Settings.this,playerChanged, Toast.LENGTH_SHORT).show();
}
_
(またはgetChildAt(position)
を使用できますが、これは遅くなります。)
レイアウトによっては、これをさらに簡略化できる場合があることを理解してください。
ほんの小さな変更が必要です
TextView c = (TextView) v.findViewById(R.id.tvPopUpItem);
カスタムビューを使用しているため、OnItemClickListenerでView引数を渡す必要があります。次に、その値を使用して、そこに存在するTextViewの詳細を取得する必要があります。
_listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i=new Intent(ListOfAstrologers.this,AstroProForUser.class);
i.putExtra("hello",adapter.getItem(position).getUsername() );
startActivity(i);
}
});
_
ここで、usernameはクラスで宣言された文字列フィールドであり、クリックしたときに膨らんだ行の詳細を取得するには、アダプタークラスのgetItem()
メソッドをオーバーライドする必要があります。