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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

925閲覧

fragmentのlistviewから遷移する際の値の受け渡し

taro_yamada

総合スコア55

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/03/11 13:59

編集2019/03/14 15:26

フラグメントのリストビューをクリックして詳細画面にフラグメントに遷移するプログラムを書いています。

 リストで利用した情報をそのまま遷移先のフラグメントで使用したいです。

 bundleに保存しようとしたところ、String codeForBundleに代入する部分で、codeのシンボルを見つけられませんというエラーが生じました。

 かなりの初心者的な質問とは承知していますが、ListViewに使われた値はどこから呼び出せばいいのでしょうか?

ListAdapter

1 private class ViewHolder{ 2 TextView code; 3 TextView name; 4 }

Fragment_Manage.java

1 2 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 3 @Override 4 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 5 Fragment_Manage_Detail fragment = new Fragment_Manage_Detail(); 6 Bundle bundle = new Bundle(); 7 String codeForBundle = code[position]; 8 String nameForBundle = name[position]; 9 bundle.putString("code",codeForBundle); 10 bundle.putString("name",nameForBundle); 11 fragment.setArguments(bundle); 12 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 13 FragmentTransaction transaction = fragmentManager.beginTransaction(); 14 transaction.replace(R.id.main_frame, fragment); 15 transaction.addToBackStack(null); 16 transaction.commit(); 17 } 18 });

mailListAdapter

1public class MainListAdapter extends BaseAdapter { 2 Context context; 3 private LayoutInflater layoutInflater; 4 ArrayList<MainList> mainList; 5 6 7 public MainListAdapter(Context context){ 8 this.context = context; 9 this.layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 10 } 11 12 13 public void setMainList(ArrayList<MainList> mainList) { 14 this.mainList = mainList; 15 } 16 17 @Override 18 public int getCount(){ 19 return mainList.size(); 20 } 21 22 @Override 23 public Object getItem(int position){ 24 return mainList.get(position); 25 } 26 27 @Override 28 public long getItemId(int position) { 29 return 0; 30 } 31 32 33 34 private class ViewHolder{ 35 TextView meigaracode; 36 TextView companyname; 37 TextView bbstart; 38 TextView bbend; 39 TextView yosokakaku; 40 } 41 42 @Override 43 public View getView(int position, View convertView, ViewGroup parent){ 44 45 ViewHolder viewHolder; 46 if(convertView == null){ 47 LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 48 convertView = inflater.inflate(R.layout.mainlist, parent, false); 49 viewHolder = new ViewHolder(); 50 viewHolder.meigaracode = (TextView)convertView.findViewById(R.id.meigaraText); 51 viewHolder.companyname = (TextView)convertView.findViewById(R.id.companynameText); 52 viewHolder.bbstart = (TextView)convertView.findViewById(R.id.bbStart); 53 viewHolder.bbend = (TextView)convertView.findViewById(R.id.bbEnd); 54 viewHolder.yosokakaku = (TextView)convertView.findViewById(R.id.yosoKabuka); 55 56 convertView.setTag(viewHolder); 57 } else { 58 viewHolder = (ViewHolder)convertView.getTag(); 59 } 60 MainList item = (MainList)getItem(position); 61 62 viewHolder.bbstart.setText(item.getBbstart()); 63 viewHolder.bbend.setText(item.getBbend()); 64 viewHolder.meigaracode.setText(item.getMeigaracode()); 65 viewHolder.companyname.setText(item.getCompanyname()); 66 return convertView; 67 } 68 69 70}

Fragment_Manage

1public class Fragment_Manage extends Fragment { 2 3 private static final String TAG = "MainActivity"; 4 private ArrayList<MainList> main_List = new ArrayList<MainList>(); 5 MainListAdapter adapter; 6// MainListAdapter adapter = new MainListAdapter(null, main_List); 7 8 ListView mListView; 9 10 11 public void onCreate(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 // setContentView(R.layout.activity_main); 14 } 15 16 17 @Nullable 18 @Override 19 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 20 final View v = inflater.inflate(R.layout.fragment_manage, container, false); 21 22 mListView = (ListView) v.findViewById(R.id.main_listview); 23 24 String url = "http://*/api/info/"; 25 26 JsonArrayRequest jsArrayRequest = new JsonArrayRequest( 27 Request.Method.GET, 28 url, 29 null, 30 new Response.Listener<JSONArray>() { 31 @Override 32 public void onResponse(JSONArray response) { 33 main_List.clear(); 34 for (int i = 0; i < response.length(); i++) { 35 36 try { 37 JSONObject obj = response.getJSONObject(i); 38 MainList mainList = new MainList(); 39 mainList.setMeigaraCode(obj.getString("meigaracode")); 40 mainList.setCompanyname(obj.getString("companyname")); 41 mainList.setBbstart(obj.getString("bbstart")); 42 mainList.setBbend(obj.getString("bbend")); 43 main_List.add(mainList); 44 45 } catch (JSONException e) { 46 e.printStackTrace(); 47 } 48 49 } 50 MainListAdapter adapter = new MainListAdapter(v.getContext()); 51 adapter.setMainList(main_List); 52 mListView.setAdapter(adapter); 53 } 54 }, 55 new Response.ErrorListener() { 56 @Override 57 public void onErrorResponse(VolleyError error) { 58 Log.d(TAG, error.toString()); 59 60 } 61 } 62 ); 63 MySingleton.getInstance(this.getActivity()).addToRequestQueue(jsArrayRequest); 64 65 //以下、クリックによる遷移を試作H31.3.04 66 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 67 @Override 68 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 69 Fragment_Manage_Detail fragment = new Fragment_Manage_Detail(); 70 Bundle bundle = new Bundle(); 71 MainList item = (MainList)adapter.getItem(position); 72 String meigaracodeForBundle = item.getMeigaracode(); 73 String companynameForBundle = item.getCompanyname(); 74 String bbstartForBundle = item.getBbstart(); 75 String bbendForBundle = item.getBbend(); 76 bundle.putString("meigaracode",meigaracodeForBundle); 77 bundle.putString("companyname",companynameForBundle); 78 bundle.putString("bbstart",bbstartForBundle); 79 bundle.putString("bbend",bbendForBundle); 80 fragment.setArguments(bundle); 81 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 82 FragmentTransaction transaction = fragmentManager.beginTransaction(); 83 transaction.replace(R.id.main_frame, fragment); 84 //backボタンで戻ってこれるように 85 transaction.addToBackStack(null); 86 transaction.commit(); 87 } 88 }); 89 90 91// return super.onCreateView(inflater, container, savedInstanceState); 92 return v; 93 } 94 95 96} 97

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mListView に設定した Adapter の getItem(position) メソッドを使用して戴ければ, 該当位置のデータオブジェクトを得られると思います.

投稿2019/03/11 16:35

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_yamada

2019/03/13 13:54

ご対応ありがとうございます。 String codeForBundle = adapter.getItem(position); のように変えてみたのですが、StringにはObjectは入らないといったエラーが出ています。 初心者的な質問で本当に申し訳ありません。 そもそも、Objectという変数?を宣言するのはどうしたら良いでしょうか? また、このあと、codeをオブジェクトで宣言してgetItemで取得→ブンドルに入れて次のフラグメントに送る→次のフラグメントの中でオブジェクトからcodeやnameを取得するといった流れになるのではないかと想像していますが、方向性としては間違っていないでしょうか? この近辺のWEB上の情報が、難しくて理解に苦しんでいます。すみません。
jimbe

2019/03/14 15:06 編集

「fragmentのlistviewから遷移」( https://teratail.com/questions/178442 ) におきまして getView 内で MainList item = (MainList)getItem(position); とされている通り, getItem は Adapter が管理するオブジェクトを返します. このご質問とは違うアダプタでしょうか. code と name は, String codeForBundle = item.getMeigaracode(); String nameForBundle = item.getCompanyname(); となるかと思ったのですが.
taro_yamada

2019/03/14 14:15

確かに、自分で作ったAdapterの中身をすっかり忘れていましたw ちなみに、String codeForBundle = item.getMeigaracode();の中のitemは、何を入れるべきでしょうか? itemではcannnot resolveとなり、mListViewも入れられませんでした。 聞いてばかりで申し訳ありません。よろしくお願いいたします。
jimbe

2019/03/14 14:38

String codeForBundle = adapter.getItem(position); で adapter へのアクセスについてはエラーとなっていなかったのでしたら, (178442 のご質問では getView は adapter 内だったので不要でしたが) MainList item = (MainList)adapter.getItem(position); String codeForBundle = item.getMeigaracode(); String nameForBundle = item.getCompanyname(); となるのではないでしょうか. なお、 adapter の型パラメータが MainList であれば, getItem の MainList へのキャストは無くても大丈夫になっていると思います.
taro_yamada

2019/03/14 15:01

String codeForBundle = adapter.getItem(position); では、stringにobjectを返していますというエラーになります。 なお・・・ MainList item = (MainList)adapter.getItem(position); String meigaracodeForBundle = item.getMeigaracode(); String companynameForBundle = item.getCompanyname(); と記載して実行したところ、クリックしたところしたのエラーとともにアプリが終了しました。 2019-03-14 23:53:37.441 5893-5893/ E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object com.example..MainListAdapter.getItem(int)' on a null object reference 下の注意していただいた点の影響でしょうか? あまり理解できていません。すみません。 >>なお、 adapter の型パラメータが MainList であれば, getItem の MainList へのキャストは無くても大丈夫になっていると思います
jimbe

2019/03/14 15:09

MainListAdapter と, この mListView を含むアクティビティ? のコードを全文ご提示願えますか?
taro_yamada

2019/03/15 12:03

記載してみました。いかがでしょう?
jimbe

2019/03/15 16:44

アダプタは BaseAdapter を extends でしたか. では getItem のキャストは必要ですね. リストをクリックした時の adapter ですが... 少々 Fragment_Manage の作りにビックリしましたが... onResponse の最後のほうにある MainListAdapter adapter = new MainListAdapter(v.getContext()); となっている行を adapter = new MainListAdapter(v.getContext()); として, Fragment_Manage のフィールドの adapter に設定するようにしてみてください.
taro_yamada

2019/03/15 22:31

動きました! いつも申し訳ないのですが、MainListAdapterをつけると付けないで何が変わったのでしょうか? 勉強不足で本当に申し訳ないです。
taro_yamada

2019/03/15 22:32

週末結婚式で今から出かけるので、日曜日の夜に続きを回答します。 すみません。
jimbe

2019/03/16 00:56

行ってらっしゃいませ^^ MainListAdapter をつけると付けないでは, スコープ(=使える範囲)の違う変数を使うことになります. そもそも Fragment_Manage の先頭の方で, MainListAdapter adapter; として MainListAdapter 型の adapter 変数が宣言されていましたが, (コードを修正しているうちに放置となったのか)未使用状態でした. この変数はクラスのフィールドとして, クラス内のどこからでも使用できます. (より正確には, "private" 等が付いていないので, 同じパッケージに属する他のクラスからも使用できます.) が, 何の値も設定されていませんので初期値として自動的に null が設定されています. 未使用ですが存在しますので, onItemClick 内で adapter.getItem(position) と書いてもコンパイルは通ります. (未使用の変数を放置せず削除していれば, ここで "adapter が無い" というコンパイルエラーとなってより早く問題(?)が発見されたでしょう.) コンパイルが通ることでアプリは実行でき, adapter が null のまま getItem を呼び出すことになり, NullPointerException で終了することになりました. 一方, もう1つの MainListAdapter 型の変数が(同じ名前の) adapter として Response.Listener の onResponse 内で使用されていました. こちらはメソッドの内部で宣言されているので, スコープはこの関数内のみとなります. この位置では先のフィールドの adapter も使用できるのですが, よりスコープの狭いほうが優先されます. 生成後, 値が設定(setMainList)されてリストビューにも設定(setAdapter)されますが, onResponse が終われば変数は消滅します. (変数は消滅しますが, 変数が指していた実体はリストビューにきちんと設定されています. 念のため) 未使用で null のまま getItem をしようとした"フィールドの adapter" と, 使用されていてもメソッドが終わると消える"メソッドの adapter". 昼ドラのようですが^^; 実行順としては onResponse でリストが表示された後に onItemClick ですので, "メソッドの adapter" を"フォールドの adapter" に保存しておけば onItemClick で null にならないと考えました. より範囲の広いスコープの変数を使うには, 単に狭いスコープの"宣言"をしなければ出来ます. MainListAdapter adapter = new MainListAdapter(v.getContext()); は **adapter の宣言と同時に** 値を設定していますが, 最初の "MainListAdapter" を消すと, フィールドの adapter に値を設定することになります. これで getItem 時にリストビューに設定した adapter が使用できるようになりました.
taro_yamada

2019/03/17 14:01

なるほど、わかりました。 とても助かりました。ありがとうございます。 経験が少ないのに、色々なHPの情報を寄せ集めてソースを書いているので、所々理解できずに残している所があるみたいです。 さて、次の作業に移っていきたいと思いますが、この様子だと、詳細のフラグメントでもデータを受け取れない等のエラーが生じてしまうしょうな予感がしています笑 またつまらない質問をしてしまうかもしれませんが、お時間あるときによろしくお願いします。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問