リストのアイテムをクリックしたら、フラグメントを切り替えて値を渡すようにする処理を、
リストのアダプタクラス内に記述しました。
実機で確認した際、この処理が実行される時点でエラーが出ました。
NullPointerExceptionについて発生する原因など調べてみたのですが、
自分のケースではどこをどうしたらよいのか分かりませんでした。
エラーになっている理由や解決策を教えて頂けないでしょうか
エラーメッセージ
12-17 20:28:42.115 18003-18003/com.kashikoma.memo E/AndroidRuntime: FATAL EXCEPTION: main Process: com.kashikoma.memo, PID: 18003 java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference at com.kashikoma.memo.MemoAdapter$1.onClick(MemoAdapter.java:45) at android.view.View.performClick(View.java:4799) at android.view.View$PerformClick.run(View.java:19938) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5384) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
該当コード
エラーの該当部分は OnBindViewHolder > OnClick内 です。
public class MemoAdapter extends RealmRecyclerViewAdapter<Memo, MemoAdapter.MemoViewHolder> { private OrderedRealmCollection<Memo> mDataset; MemoAdapter(OrderedRealmCollection<Memo> memoDataset) { super(memoDataset, true); this.mDataset = memoDataset; setHasStableIds(true); } @Override public MemoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_memolist, parent, false); return new MemoViewHolder(view); } @Override public void onBindViewHolder(final MemoViewHolder holder, final int position) { final Memo obj = getItem(position); holder.memo.setText(obj.getMemo()); holder.id.setText(obj.getId()); // アイテムクリックされたら編集画面へ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String id = obj.getId(); Bundle bundle = new Bundle(); bundle.putString("id", id); EditMemoFragment fragment = new EditMemoFragment(); fragment.setArguments(bundle); fragment.getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); } }); } @Override public int getItemCount() { return mDataset.size(); } static class MemoViewHolder extends RecyclerView.ViewHolder { TextView memo; TextView id; MemoViewHolder(View view) { super(view); memo = view.findViewById(R.id.memoContent); id = view.findViewById(R.id.memoId); } } }
関連コード
・メインアクティビティ
public class MemoListActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_memolist); if (findViewById(R.id.container) != null) { if (savedInstanceState != null) {return;} TaskListFragment firstFragment = new TaskListFragment(); firstFragment.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().add(R.id.container, firstFragment).commit(); } //ボトムナビゲーション BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation); bottomNavigationView.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.action_memo: { MemoListFragment fragment = MemoListFragment.newInstance(); getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); return true; } case R.id.action_task: { ... } } return false; } }); //Realm初期化・アプリ起動時のActivityに記述 Realm.init(this); RealmConfiguration config = new RealmConfiguration.Builder().build(); Realm.setDefaultConfiguration(config); } } ``` ・containerに表示されるフラグメント(onCreateView内でアダプタがnewされている) ```ここに言語を入力 public class MemoListFragment extends Fragment { private FloatingActionButton fab; private MemoListActivity memoListActivity; private RecyclerView recyclerView; private Realm realm; private MemoAdapter adapter; public static MemoListFragment newInstance(){ MemoListFragment f = new MemoListFragment(); Bundle args = new Bundle(); f.setArguments(args); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_memo_list, container, false); fab = view.findViewById(R.id.intentEditMemo); realm = Realm.getDefaultInstance(); // Realmをインスタンス化 final RealmResults<Memo> result = realm.where(Memo.class).findAll() // テーブルから全レコード取得 .sort("id", Sort.DESCENDING);// 降順にソート adapter = new MemoAdapter(result); // その結果をアダプターに渡す recyclerView = view.findViewById(R.id.memoList); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(adapter); recyclerView.setHasFixedSize(true); recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); return view; } @Override public void onStart() { super.onStart(); //新規作成ボタン fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Bundle bundle = new Bundle(); bundle.putString("id", ""); EditMemoFragment fragment = new EditMemoFragment(); fragment.setArguments(bundle); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.container, fragment.newInstance(),"EditMemoFragment").commit(); } }); } @Override public void onDestroy() { super.onDestroy(); recyclerView.setAdapter(null); realm.close(); } } ```
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/19 03:11
2019/12/19 03:30 編集
2019/12/19 07:04
2019/12/19 13:08
2019/12/19 14:10
2019/12/19 14:21 編集
2019/12/20 09:12
2019/12/20 09:30
2019/12/20 11:46
2019/12/20 12:26
2019/12/20 12:35 編集
2019/12/20 12:35
2019/12/20 14:04
2019/12/21 05:36 編集
2019/12/21 05:44
2019/12/21 05:46
2019/12/21 08:09
2019/12/21 08:29 編集
2019/12/21 08:58