web-dev-qa-db-ja.com

OnItemClickリストビューの項目の値を取得します

リストビューのカスタムアダプター内で選択したアイテムの値を取得しようとします。私はこれを次のコードで試します:

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();

                }

最初はクリックすると値は適切ですが、スクロールして別のアイテムをクリックすると、クリックしたアイテムの誤った値が表示されます...これの原因は何ですか?

13
Matthias Vanb

パラメータ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)を使用できますが、これは遅くなります。)

レイアウトによっては、これをさらに簡略化できる場合があることを理解してください。

49
Sam

ほんの小さな変更が必要です

TextView c = (TextView) v.findViewById(R.id.tvPopUpItem);

カスタムビューを使用しているため、OnItemClickListenerでView引数を渡す必要があります。次に、その値を使用して、そこに存在するTextViewの詳細を取得する必要があります。

0
Ron
_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()メソッドをオーバーライドする必要があります。