質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

Android Dialogで表示したList内のクリックイベント

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 672

score 3

Dialog内で表示したList内の項目を選択(クリック)した後、アプリが落ちてしまいます。
下記にコードとLogcatのエラー内容を記載しています。
Logcatでは「ClassCastException」と表記があり、内容をネットで調べると型の問題だとありましたが、setTextではString型はNGなのでしょうか。アドバイスください。
プログラムの大まかな内容は、Android端末のストレージ内に保存されているCSVファイル(プログラムでは「文字.csv」)を1行ずつ読み込み、ListViewで表示させるものです。

その他、必要情報ありましたら、コメントお願い致します。

import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class HistricalDataNameActivity extends AppCompatActivity {

    EditText editText_nameChoice ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_histrical);


        Button searchButton = findViewById(R.id.name_read);
        editText_nameChoice = (EditText) findViewById(R.id.edit_text_name);


        searchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                final ArrayList<Item> lines = new ArrayList<Item>();
                try {
                    String filePath = "/文字.csv";

                    filePath = Environment.getExternalStorageDirectory().getPath() + filePath;
                    File f = new File(filePath);
                    InputStreamReader osr = new InputStreamReader(new FileInputStream(f), "Shift-JIS");

                    try (BufferedReader reader = new BufferedReader(osr)) {
                        while (true) {
                            String line = reader.readLine();
                            if (line == null) {
                                break;
                            }
                            Item item = new Item();
                            item.setStringItem(line);
                            lines.add(item);
                        }
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                    }

                    CustomAdapter adapter = new CustomAdapter(getApplicationContext(), 0, lines);
                    final ListView listView = new ListView(HistricalDataNameActivity.this);
                    listView.setAdapter(adapter);

                    AlertDialog dialog = new AlertDialog.Builder(HistricalDataNameActivity.this)
                            .setTitle("選択してください。")
                            .setView(listView).create();
                    dialog.show();

                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


                            String nameList = (String)listView.getItemAtPosition(position);
                            //↓エラー部分
                            editText_nameChoice.setText(nameList);
                        }
                    });


                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });

    }

    public class Item{
        private String stringItem;

        public void setStringItem(String stringItem){
            this.stringItem = stringItem;
        }
        public String getStringItem(){
            return this.stringItem;
        }


    }

    public class CustomAdapter extends ArrayAdapter<Item> {
        private LayoutInflater inflater;

        public CustomAdapter(Context context, int resource, List<Item> objects) {
            super(context, resource, objects);
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        @Override
        public View getView(int position, View v, ViewGroup parent) {
            Item item = (Item)getItem(position);
            if (null == v) v = inflater.inflate(R.layout.dialog_name, null);

            TextView intTextView = (TextView)v.findViewById(R.id.string_item);
            intTextView.setText(item.getStringItem());
            return v;
        }
    }

}
java.lang.ClassCastException: jp.co.nnn.aiueo.HistricalDataNameActivity$Item cannot be cast to java.lang.String
        at jp.co.nnn.aiueo.HistricalDataNameActivity$1$1.onItemClick(HistricalDataNameActivity.java:83)
        at android.widget.AdapterView.performItemClick(AdapterView.java:310)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3128)
        at android.widget.AbsListView$3.run(AbsListView.java:4043)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

  String nameList = (String)listView.getItemAtPosition(position);
  //↓エラー部分
  editText_nameChoice.setText(nameList);


getItemAtPosition で返されるオブジェクトは何でしょう.
String で無ければ, 例え String にキャストしても setText 内部で処理できないので, 例外を発するのではないでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/28 13:53

    ご回答ありがとうございます。
    (String)listView.getItemAtPosition(position)は、listView内の文字列(positionの番号に位置する文字列)が読み込まれているとの認識でしたが、listView内の文字列では無いから、エラーが起きている。で認識としては合ってますか?
    String型にキャストすれば良いものでもないのですね。
    調査進めます。

    キャンセル

  • 2019/08/28 16:08

    ListView 内の文字列というは, つまり getView で各 View に設定している文字列ということでしょうか.
    残念ながら, ListView は getView の結果を表示しているだけで, View の中身は知りません.
    メッセージに「jp.co.nnn.aiueo.HistricalDataNameActivity$Item cannot be ~」と書いてあります通り, getItemAtPosition が Item オブジェクトを返していることが推察されます.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る