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

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

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

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Android

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

Q&A

解決済

1回答

1238閲覧

listviewの1行をタップして次の画面に遷移したいが、 呼び出したメゾットがnullと言われる。

riria

総合スコア1

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Android

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

0グッド

0クリップ

投稿2020/10/19 16:05

編集2020/10/22 05:56

listviewの1行をタップして、次の画面に遷移したいのですが、
取得したメソッドがnullと言われ、クラッシュし、画面遷移できません。

どなたか原因をご教授いただけると嬉しいです。

以下、エラー文です。

2020-10-20 00:45:10.522 24959-24959/com.websarva.wing.android.trylistviewbydatebinding E/AndroidRuntime: FATAL EXCEPTION: main Process: com.websarva.wing.android.trylistviewbydatebinding, PID: 24959 java.lang.NullPointerException: Attempt to invoke virtual method 'void com.websarva.wing.android.trylistviewbydatebinding.MainActivity.onGoEditRecord()' on a null object reference

以下、コードです。
↓activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2 3<layout> 4 <data> 5 <variable 6 name="ViewModel" 7 type="com.websarva.wing.android.trylistviewadaptermvvm.MainViewModel" /> 8 </data> 9 <LinearLayout 10 android:id="@+id/container" 11 xmlns:android="http://schemas.android.com/apk/res/android" 12 xmlns:tools="http://schemas.android.com/tools" 13 android:layout_width="match_parent" 14 android:layout_height="match_parent" 15 tools:context=".MainActivity"> 16 17 18 <ListView 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:id="@+id/listView"/> 22 23 24 </LinearLayout> 25</layout>

↓foodrow.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<layout> 3 <data> 4 <variable 5 name="ViewModel" 6 type="com.websarva.wing.android.trylistviewadaptermvvm.MainViewModel" /> 7 </data> 8 <LinearLayout 9 xmlns:android="http://schemas.android.com/apk/res/android" 10 android:orientation="vertical" 11 android:layout_width="match_parent" 12 android:layout_height="match_parent"> 13 14 <LinearLayout 15 android:orientation="horizontal" 16 android:layout_width="match_parent" 17 android:layout_height="match_parent" 18 android:onClick="@{()->ViewModel.onClicked()}"> 19 20 <TextView 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="@{ViewModel.header ,default = v3月14日}" 24 android:id="@+id/name" 25 android:textSize="30dp" 26 android:layout_weight="2" /> 27 28 <TextView 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:text="@{ViewModel.desc ,default = v3月14日}" 32 android:id="@+id/price" 33 android:textSize="30dp" 34 android:layout_weight="1" /> 35 </LinearLayout> 36 37 </LinearLayout> 38</layout>

↓MainActivity.java

java

1package com.websarva.wing.android.trylistviewadaptermvvm; 2 3import androidx.appcompat.app.AppCompatActivity; 4import androidx.databinding.DataBindingUtil; 5 6import android.content.Intent; 7import android.os.Bundle; 8 9import com.websarva.wing.android.trylistviewadaptermvvm.databinding.ActivityMainBinding; 10import com.websarva.wing.android.trylistviewadaptermvvm.databinding.ActivityMainBindingImpl; 11 12import java.util.ArrayList; 13 14public class MainActivity extends AppCompatActivity implements Navigator { 15 private ActivityMainBinding activityMainBinding; 16 private MainViewModel mainViewModel; 17 private ArrayList<MainViewModel> mainViewModelArrayList; 18 private MyAdapter myAdapter; 19 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 //setContentView(R.layout.activity_main); 25 activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 26 mainViewModel= new MainViewModel(); 27 mainViewModel.setNavigator(this); 28 mainViewModelArrayList = mainViewModel.getArrayList(); 29 myAdapter = new MyAdapter(this, mainViewModelArrayList); 30 activityMainBinding.listView.setAdapter(myAdapter); 31 //mainFragment.setViewModel(mainViewModel); 32 } 33 34 @Override 35 public void onGoEditRecord() { 36 Intent intent = new Intent(this, Bottom.class); 37 startActivity(intent); 38 } 39} 40 41

↓MainViewModel.java

java

1package com.websarva.wing.android.trylistviewadaptermvvm; 2 3import androidx.lifecycle.MutableLiveData; 4 5import java.util.ArrayList; 6 7public class MainViewModel { 8 9 public String header; 10 public String desc; 11 public Navigator mNavigator; 12 13 public MainViewModel(Model model){ 14 this.header = model.header; 15 this.desc = model.desc; 16 17 } 18 19 public MainViewModel() { 20 } 21 22 23 public void setNavigator(Navigator navigator) { 24 this.mNavigator = navigator; 25 26 } 27 28 public String getHeader() { 29 return header; 30 } 31 32 public void setHeader(String header) { 33 this.header = header; 34 } 35 36 public String getDesc() { 37 return desc; 38 } 39 40 public void setDesc(String desc) { 41 this.desc = desc; 42 } 43 44 public ArrayList<MainViewModel> getArrayList(){ 45 ArrayList<MainViewModel> modelArrayList = new ArrayList<>(); 46 MainViewModel viewModel1 = new MainViewModel(new Model("りんご","100")); 47 MainViewModel viewModel2 = new MainViewModel(new Model("みかん","100")); 48 MainViewModel viewModel3 = new MainViewModel(new Model("いちご","100")); 49 MainViewModel viewModel4 = new MainViewModel(new Model("スイカ","100")); 50 51 modelArrayList.add(viewModel1); 52 modelArrayList.add(viewModel2); 53 modelArrayList.add(viewModel3); 54 modelArrayList.add(viewModel4); 55 56 return modelArrayList; 57 58 } 59 60 public void onClicked(){ 61 System.out.println(mNavigator); 62 mNavigator.onGoEditRecord(); 63 } 64} 65 66

↓MyAdapter.java

java

1package com.websarva.wing.android.trylistviewadaptermvvm; 2 3import android.content.Context; 4import android.view.LayoutInflater; 5import android.view.View; 6import android.view.ViewGroup; 7import android.widget.ArrayAdapter; 8 9import androidx.annotation.NonNull; 10import androidx.annotation.Nullable; 11import androidx.databinding.DataBindingUtil; 12 13import com.websarva.wing.android.trylistviewadaptermvvm.databinding.FoodrowBinding; 14 15import java.util.ArrayList; 16 17public class MyAdapter extends ArrayAdapter<MainViewModel> { 18 private ArrayList<MainViewModel> modelArrayList; 19 private Context context1; 20 21 public MyAdapter(@NonNull Context context, ArrayList<MainViewModel> modelArrayList){ 22 super(context, R.layout.foodrow,modelArrayList); 23 this.context1 = context; 24 this.modelArrayList = modelArrayList; 25 } 26 27 @NonNull 28 @Override 29 public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 30 31 LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 32 FoodrowBinding foodrowBinding = DataBindingUtil.inflate(layoutInflater,R.layout.foodrow,parent,false); 33 foodrowBinding.setViewModel(modelArrayList.get(position)); 34 35 return foodrowBinding.getRoot(); 36 } 37} 38

↓Navigator.java

JAVA

1package com.websarva.wing.android.trylistviewadaptermvvm; 2 3public interface Navigator { 4 void onGoEditRecord(); 5 6}

↓Model.java

Java

1package com.websarva.wing.android.trylistviewadaptermvvm; 2 3public class Model { 4 public String header; 5 public String desc; 6 7 public Model(String header, String desc) { 8 this.header = header; 9 this.desc = desc; 10 } 11}

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

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

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

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

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

pg0084

2020/10/22 02:49

ListViewに値をセットしているのはMainFragmentでしょうか? 今載せていただいているコードで判断難しいため、ListView使用しているコードを見せていただくことはできますか?
riria

2020/10/22 05:54 編集

ご質問ありがとうございます。 全てのコードをのせてました。 Listviewにセットしているのは、viewmodelです。 前回載せた時から中身をいじっているので、変更してしまっている箇所がいくつかありますが、 依然として、同じエラーが出ています。 自分で調べているうちに、MainViewModel.java の以下の部分でmNavigatorがnullになっているため、本エラーが起きているようです。 public void onClicked(){ System.out.println(mNavigator); mNavigator.onGoEditRecord(); } MainViewModel.java のsetNavigatorでは、mNavigatorはnullではないので、 どこか途中で、mNavigatorがnullに初期化されているような気がしています。 原因・解決方法をご存知でしたら、教えて頂けると、幸いです。
pg0084

2020/10/22 05:55

activity_main.xml に list_viewまたはlistViewがないようなのですが、activityMainBinding.listViewはどこをみてるんでしょうか?
riria

2020/10/22 05:57

すいません、転載ミスをしていまして、今は修正済です。 activity_main.xml の中にlistviewを用意しております。
guest

回答1

0

ベストアンサー

MainViewModel.java のsetNavigatorでは、mNavigatorはnullではないので、

どこか途中で、mNavigatorがnullに初期化されているような気がしています。

結論としてはgetArrayListでnew ViewModel()をしてArrayListを作ってる際に、各ViewModelにsetNavigatorをしていないのでnavigatorが存在していないのだと思います。

ちょっと基礎的なことから言うと、VIewModelはList単位ではなく、画面単位で持つことをオススメします。
MainViewModel内でMainViewModelのリストを作るのはそもそもあまり好ましくないため、MainViewModelの複製をMainActivityでやるか、以下のようにMainViewModelをAdapterに渡してそこArrayList<Model>
を作成して渡すと言うのが良いかと思います。

どうしてもitemのclickイベントをviewModelに紐付けたい場合は以下のような形式が良いのかと思います。
脳内コンパイルで申し訳ないですが、お試しください。

positionが必要な場合はxmlのonClickにやModelの値をつけてあげて下さい。

MainViewModel.java

java

1 2public ArrayList<Model> modelArrayList; 3 4 public MainViewModel(Model model){ 5 this.header = model.header; 6 this.desc = model.desc; 7 8 setArrayList(); 9 } 10 11 private ArrayList<Model> setArrayList(){ 12 ArrayList<Model> modelArrayList = new ArrayList<>(); 13 modelArrayList.add(new Model("りんご","100")); 14 modelArrayList.add(new Model("みかん","100")); 15 modelArrayList.add(new Model("いちご","100")); 16 modelArrayList.add(new Model("スイカ","100")); 17 18 this.modelArrayList = modelArrayList; 19 }

MyAdapter.java

java

1public class MyAdapter extends ArrayAdapter<MainViewModel> { 2 private MainViewModel mainViewModel; 3 private Context context1; 4 5 public MyAdapter(@NonNull Context context, MainViewModel viewModel){ 6 super(context, R.layout.foodrow,modelArrayList); 7 this.context1 = context; 8 this.mainViewModel = viewModel; 9 } 10 11 @NonNull 12 @Override 13 public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 14 15 LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 16 FoodrowBinding foodrowBinding = DataBindingUtil.inflate(layoutInflater,R.layout.foodrow,parent,false); 17 foodrowBinding.setViewModel(mainViewModel); 18 foodrowBinding.setPosition(position); 19 20 return foodrowBinding.getRoot(); 21 } 22}

foodrow.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<layout> 3 <data> 4 <variable 5 name="ViewModel" 6 type="com.websarva.wing.android.trylistviewadaptermvvm.MainViewModel" /> 7 8 <variable 9 name="position" 10 type="Integer" /> 11 </data> 12 <LinearLayout 13 xmlns:android="http://schemas.android.com/apk/res/android" 14 android:orientation="vertical" 15 android:layout_width="match_parent" 16 android:layout_height="match_parent"> 17 18 <LinearLayout 19 android:orientation="horizontal" 20 android:layout_width="match_parent" 21 android:layout_height="match_parent" 22 android:onClick="@{()->ViewModel.onClicked()}"> 23 24 <TextView 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:text="@{ViewModel.modelArrayList[position].header ,default = v3月14日}" 28 android:id="@+id/name" 29 android:textSize="30dp" 30 android:layout_weight="2" /> 31 32 <TextView 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:text="@{ViewModel.desc ,default = v3月14日}" 36 android:id="@+id/price" 37 android:textSize="30dp" 38 android:layout_weight="1" /> 39 </LinearLayout> 40 41 </LinearLayout> 42</layout>

投稿2020/10/22 06:38

pg0084

総合スコア100

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

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

riria

2020/11/02 13:23

丁寧な回答ありがとうございます。 MainViewModelをAdapterに渡すやり方でうまく行きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問