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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

2750閲覧

Realmを使ってリストビューを表示することができない

intenseG

総合スコア34

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/10/16 11:10

編集2016/10/21 06:16

###前提・実現したいこと
初めての質問です。Java、android開発歴は2か月程の初級者ですがよろしくお願いします。

囲碁の問題を出題するアプリを作っているのですが、問題リストをリストビューで表示する段階で躓いています。

jsonファイルから問題情報を読み込むところまではできてますが、ListViewにそのデータを表示する段階のどこかでおかしいことをしているようです。

デバッグ、Log出力も試してみましたが原因は掴めず。

突っ込みどころの多いソースコードだとは思いますが、よければ改善策をご教授頂けないでしょうか?

よろしくお願いします。

###発生している問題・エラーメッセージ

エラーは起きていませんが、リストビューに何も表示されません。

リストビュー表示画面

###該当のソースコード

GoDataAdapter.java

Java

1 2------------省略---------------- 3 4 public GoDataAdapter(Context context){ 5 super(context, 0); 6 mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 7 } 8 9 public void setGoDataArrayList(ArrayList<GoData> goDataArrayList){ 10 mGoDataArrayList = goDataArrayList; 11 } 12 13 @NonNull 14 @Override 15 public View getView(int position, View convertView, @NonNull ViewGroup parent) { 16 17 if (convertView == null){ 18 convertView = mLayoutInflater.inflate(R.layout.list_item, null); 19 } 20 21 TextView q_num_level =(TextView) convertView.findViewById(R.id.q_num_level); 22 TextView teban = (TextView) convertView.findViewById(R.id.teban); 23 24 q_num_level.setText(mGoDataArrayList.get(position).getQNum() + " " + 25 mGoDataArrayList.get(position).getLevel()); 26 teban.setText(mGoDataArrayList.get(position).getTeban()); 27 28 return convertView; 29 } 30}

###追記

ProblemList.java

Java

1 2------------省略---------------- 3 4 @Override 5 protected void onCreate(@Nullable Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.problem_list); 8 9 //Realmの設定 10 mRealm = Realm.getDefaultInstance(); 11 mRealm.addChangeListener(mRealmListener); 12 mGoDataRealmResults = mRealm.where(GoData.class).findAll(); //ここでdata : size = 1になった 13 14 //ListViewの設定 15 mListView = (ListView) findViewById(R.id.listView1); 16 17 //ListViewをタップしたときの処理 18 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 19 @Override 20 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 21 22 GoData goData = (GoData) parent.getAdapter().getItem(pos); 23 24 Intent intent = new Intent(ProblemList.this, Problem.class); 25 intent.putExtra(EXTRA_GODATA, goData); 26 27 startActivity(intent); 28 } 29 }); 30 } 31 32 @Override 33 public void onResume() { 34 super.onResume(); 35 36 if (mGoDataAdapter == null) { 37 List<GoData> dataList = null; 38 try { 39 dataList = loadGoData(); 40 } catch (IOException e) { 41 e.printStackTrace(); 42 } 43 44 mGoDataAdapter = new GoDataAdapter(this); 45 mGoDataAdapter.setGoData(dataList); 46 47 //ListViewに表示 48 mListView.setAdapter(mGoDataAdapter); 49 mGoDataAdapter.notifyDataSetChanged(); 50 } 51 addGoData(); 52 53 reloadListView(); 54 } 55 56 @Override 57 protected void onDestroy() { 58 super.onDestroy(); 59 60 mRealm.close(); 61 } 62 63 public List<GoData> loadGoData() throws IOException { 64 65 loadJsonFromStream(); 66 67 return mRealm.where(GoData.class).findAll(); 68 } 69 70 private void loadJsonFromStream() throws IOException { 71 72 BufferedReader br; 73 String json = ""; 74 75 InputStream is = getAssets().open("sgfdata.json"); 76 77 mRealm.beginTransaction(); 78 try { 79 br = new BufferedReader((new InputStreamReader(is))); 80 String s; 81 while ((s = br.readLine()) != null) { 82 json += s; 83 } 84 85 JSONObject jsonObject = new JSONObject(json); 86 ZahyoChanger changer = new ZahyoChanger(); 87 JSONArray normal_problem = jsonObject.getJSONObject("problems").getJSONArray("normal"); 88 for (int i = 0; i < normal_problem.length(); i++) { 89 String value1 = normal_problem.getString(i); 90 changer.GoDataSeparate(value1); 91 } 92 JSONArray normal_answers = jsonObject.getJSONObject("answers").getJSONArray("normal"); 93 for (int j = 0; j < normal_answers.length(); j++) { 94 String value2 = normal_answers.getString(j); 95 changer.GoDataSeparate(value2); 96 mRealm.createAllFromJson(GoData.class, is); 97 mRealm.commitTransaction(); 98 } 99 } catch (IOException | JSONException e) { 100 mRealm.cancelTransaction(); 101 } finally { 102 if (is != null) { 103 is.close(); 104 } 105 } 106 } 107 108 private void reloadListView() { 109 110 ArrayList<GoData> goDataArrayList = new ArrayList<>(); 111 112 int[] icons = { 113 R.mipmap.ic_launcher, 114 R.mipmap.ic_launcher 115 }; 116 117 for (int i = 0; i < mGoDataRealmResults.size(); i++) { 118 119 GoData data = new GoData(); 120 121 data.setQNum(mGoDataRealmResults.get(i).getQNum()); 122 123 goDataArrayList.add(data); 124 } 125 126 mGoDataAdapter = new GoDataAdapter(this); 127 mGoDataAdapter.setGoData(goDataArrayList); 128 mListView.setAdapter(mGoDataAdapter); 129 mGoDataAdapter.notifyDataSetChanged(); 130 } 131 132 private void addGoData() { 133 134 if(mGoDataRealmResults.size() > 0){ 135 136 mRealm.beginTransaction(); 137 138 GoData data = new GoData(); 139 data.setQNum("1"); 140 data.setTeban("b"); 141 data.setLevel("-5"); 142 143 mRealm.commitTransaction(); 144 } 145 } 146}

###試したこと

Java

1if (convertView == null){ 2 convertView = mLayoutInflater.inflate(R.layout.list_item, null);

GoDataAdapterクラス内の上記のコードの(R.layout.list_item, null)は、(R.layout.simple_list_item_2, null)だったところを自作のxmlファイルに変更していますが、リストビューは表示されません。
別のところに原因があるのだと思っています。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:Java
開発ツール:androidstudio 2.2.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

mGoDataRealmResultsのサイズを確認してください。

投稿2016/10/16 12:29

yona

総合スコア18155

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

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

intenseG

2016/10/17 06:11

mGoDataRealmResultsのサイズは0でした。 ここが原因のようですが、一体何が悪いのでしょうか? 見当もつきません。。
yona

2016/10/17 06:22

たくさんのことが考えられます。 ・ファイルの読み込みに失敗している。 →デバッグで変数String jsonの内容を確認する。 ・JSON解析でパースエラーが発生している。 →デバッグで変数JSONArray normalとJSONArray normal_answersの内容を確認する。 ・DBへのインサートに失敗している。 →Realmの設定や初期化等の誤りがないか確認する。
退会済みユーザー

退会済みユーザー

2016/10/17 07:40

載せていただいたコードにはRealmにデータを保存しているところが全くありません。`mGoDataRealmResults`のサイズが0なのはそれが原因だと思います。 `addGoData()`メソッドでデータを保存しているつもりかもしれませんが、ここに書かれている処理は、Realmに保存されているデータをループして再度保存する、というちょっとよくわからない処理になっていて、そもそもデータはまだ1件も保存されていないので、その処理のループが回ることはありません。 デバッガやログ出力などを用いて1行1行確認しながらどこまで意図通りに動いているのか確認しましょう。
intenseG

2016/10/17 08:16

お二方とも回答ありがとうございます。 jsonからデータを読み込んで、指定のクラスに送り込みデータを独自の形式に変換。 その変換済みデータをRealmのデータクラスであるGoDataクラスにRealmを経由せずに直接入れようとしてたのがまずいのでしょうか? デバッグをしてて気づいたのですが、どうやらGoDataクラスに入れたはずのデータが入っていないようです。
yona

2016/10/17 10:19

入れている箇所はどこですか?
intenseG

2016/10/17 10:25

ProblemListクラス内のchanger.GoDataSeparate(value1);でZahyoChangerクラスにデータを送り込んで、独自の形式に変換。 その後、ZahyoChangerクラス内からGoDataクラスのセッターを使ってgoData.setStoneColorA(stoneColor);とGoDataクラスにデータを入れています。
yona

2016/10/17 11:00

自作のクラスについてなんてわかりませんよ。多分、そのクラスの実装も間違っていると思いますよ。 どうしたいんですか? Realmを経由したいんですか?それともしないんですか?
intenseG

2016/10/17 11:21

Realmを経由したいです。 現状だと、json読み込み→jsonデータを独自の形式に変換→Realmのデータクラスに変換したデータを受け渡す→Realmの設定初期化を行う→ListViewに表示という手順を踏んでいます。 そもそも処理の手順を間違えているのでしょうか?
yona

2016/10/17 11:57

処理の順番は間違っていませんが画面構成に問題がありそうです。 固定のjsonファイルから毎回データを読みだしてデータベースに入れる必要はありませんよね? jsonファイルからデータを読みだしてRealmに登録する画面を作りましょう。 ListViewに表示する画面はRealmからデータを取り出して表示するだけにしましょう。
退会済みユーザー

退会済みユーザー

2016/10/18 01:41

とりあえず今の問題はRealmにデータを保存できていないことが問題なので、まずそこを解決しましょう。ListViewのことはいったん置いておいてJSONをRealmのオブジェクトに変換して、Realmに保存する、というところを正しく動くようにしてみましょう。それができればListViewの表示は単にRealmResultsを渡すだけです。
intenseG

2016/10/21 06:16

すみません、返信が遅くなりました。お二方ともありがとうございます。 RealmとListViewの仕組みをちゃんと理解できてなかったので勉強しなおして、質問本文に色々書き換えたコードを追記しておきました。 今はそのコードの中でmRealm.beginTransaction()とmRealm.createAllFromJson()とmRealm.commitTransaction()の使いどころがわからず彷徨っているところです。 よろしければ教えて頂けないでしょうか?
guest

0

下記のコードで自己解決しました!アドバイスありがとうございました!

ProblemList.java

Java

1public class ProblemList extends AppCompatActivity { 2 3 public static final String EXTRA_GODATA = "com.example.oubeika.tsumegonomori.GoData"; 4 5 private Realm realm; 6 private RealmResults<GoData> results; 7 private RealmChangeListener realmListener = new RealmChangeListener() { 8 9 @Override 10 public void onChange(Object element) { 11 reloadListView(); 12 } 13 }; 14 15 private ListView listView; 16 private GoDataAdapter adapter; 17 18 @Override 19 protected void onCreate(@Nullable Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.problem_list); 22 23 //Realmの設定 24 realm = Realm.getDefaultInstance(); 25 realm.addChangeListener(realmListener); 26 27 //ListViewの設定 28 listView = (ListView) findViewById(R.id.listView1); 29 30 if (adapter == null) { 31 try { 32 results = loadGoData(); 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 37 adapter = new GoDataAdapter(ProblemList.this); 38 adapter.setGoData(results); 39 40 //ListViewに表示 41 listView.setAdapter(adapter); 42 adapter.notifyDataSetChanged(); 43 } 44 45 //ListViewをタップしたときの処理 46 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 47 @Override 48 public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 49 50 GoData goData = (GoData) parent.getAdapter().getItem(pos); 51 52 Intent intent = new Intent(ProblemList.this, Problem.class); 53 intent.putExtra(EXTRA_GODATA, goData); 54 55 startActivity(intent); 56 } 57 }); 58 } 59 60 @Override 61 protected void onDestroy() { 62 super.onDestroy(); 63 64 realm.close(); 65 } 66 67 private RealmResults<GoData> loadGoData() throws IOException { 68 69 BufferedReader br; 70 String json = ""; 71 72 InputStream is = getAssets().open("sgfdata.json"); 73 74 realm.beginTransaction(); 75 try { 76 // ファイルの読み込み 77 br = new BufferedReader((new InputStreamReader(is))); 78 String s; 79 while ((s = br.readLine()) != null) { 80 json += s; 81 } 82 Log.d(TAG, json); 83 84 JSONObject jsonObject = new JSONObject(json); 85 86 // 問題データ追加 87 //JSONArray easy = problems.getJSONArray("easy"); 88 ZahyoChanger changer = new ZahyoChanger(); 89 JSONArray normal_problem = jsonObject.getJSONObject("problems").getJSONArray("normal"); 90 for (int i = 0; i < normal_problem.length(); i++) { 91 String value1 = normal_problem.getString(i); 92 changer.GoDataSeparate(value1); 93 Log.d(TAG, "value1は " + value1 + " です!"); 94 } 95 //答えデータ追加 96 //JSONArray easy_answers = answers.getJSONArray("easy"); 97 JSONArray normal_answers = jsonObject.getJSONObject("answers").getJSONArray("normal"); 98 for (int j = 0; j < normal_answers.length(); j++) { 99 String value2 = normal_answers.getString(j); 100 changer.GoDataSeparate(value2); 101 Log.d(TAG, "value2は " + value2 + " です!"); 102 } 103 realm.commitTransaction(); 104 } catch (IOException | JSONException e) { 105 realm.cancelTransaction(); 106 } finally { 107 if (is != null) { 108 is.close(); 109 } 110 } 111 return realm.where(GoData.class).findAll(); 112 } 113 114 private void reloadListView() { 115 116 ArrayList<GoData> goDataArrayList = new ArrayList<>(); 117 118 for (int i = 0; i < results.size(); i++) { 119 Log.d(TAG, String.valueOf(results.size())); 120 121 GoData data = new GoData(); 122 123 data.setQNum(results.get(i).getQNum()); 124 data.setLevel(results.get(i).getLevel()); 125 126 goDataArrayList.add(data); 127 } 128 129 adapter = new GoDataAdapter(this); 130 adapter.setGoData(goDataArrayList); 131 listView.setAdapter(adapter); 132 adapter.notifyDataSetChanged(); 133 } 134 135 private void addGoData() { 136 137 if(results.size() > 0){ 138 139 realm.beginTransaction(); 140 141 GoData data = new GoData(); 142 data.setColP(16); 143 data.setRowP(4); 144 data.setStoneColorP(1); 145 146 data.setQNum("1"); 147 data.setTeban("b"); 148 data.setLevel("-5"); 149 150 /*for (int j = 0; j < results.size(); j++) { 151 152 data.setQNum(results.get(j).getQNum()); 153 data.setTeban(results.get(j).getTeban()); 154 data.setLevel(results.get(j).getLevel()); 155 156 data.setColP(results.get(j).getColP()); 157 data.setRowP(results.get(j).getRowP()); 158 data.setStoneColorP(results.get(j).getStoneColorP()); 159 data.setColA(results.get(j).getColA()); 160 data.setRowA(results.get(j).getRowA()); 161 data.setStoneColorA(results.get(j).getStoneColorA());*/ 162 163 realm.commitTransaction(); 164 } 165 } 166}

GoDataAdapter.java

Java

1public class GoDataAdapter extends ArrayAdapter<GoData> { 2 3 private LayoutInflater mLayoutInflater; 4 private List<GoData> data = null; 5 6 public GoDataAdapter(Context context){ 7 super(context, 0); 8 mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 9 } 10 11 public void setGoData(List<GoData> details) { 12 this.data = details; 13 } 14 15 @Override 16 public int getCount() { 17 return data.size(); 18 } 19 20 @Override 21 public GoData getItem(int pos) { 22 return data.get(pos); 23 } 24 25 @Override 26 public long getItemId(int pos) { 27 return data.get(pos).getId(); 28 } 29 30 @NonNull 31 @Override 32 public View getView(int pos, View convertView, @NonNull ViewGroup parent) { 33 34 if (convertView == null){ 35 convertView = mLayoutInflater.inflate( 36 R.layout.list_item, 37 parent, 38 false 39 ); 40 } 41 42 GoData godata = data.get(pos); 43 44 ((TextView) convertView.findViewById(R.id.q_num)) 45 .setText(godata.getQNum()); 46 ((TextView) convertView.findViewById(R.id.level)) 47 .setText(godata.getLevel()); 48 49 return convertView; 50 } 51}

投稿2016/10/22 10:27

intenseG

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問