-1

I've been trying to create a button that adds a new Value to my Arraylist (contries) when clicked, but it instead of adding my item(Card) the app simply crashes. I am also using Fragments. Here's my code.

That one is my Class for my FragmentPage

package com.example.barryblack;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class FragmentPage extends Fragment {

private RecyclerView.Adapter mAdapter;
private ArrayList countries;
Button btn;






@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
Bundle savedInstanceState) {

    CreateExampleList();

    View view = inflater.inflate(R.layout.page_fragment, container, false);

    RecyclerView recyclerView = view.findViewById(R.id.listRecyclerView);

    btn = view.findViewById(R.id.button_insert);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            InsertItem();

        }
    });

    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    RecyclerView.Adapter adapter = new MyAdapter(countries);
    recyclerView.setAdapter(adapter);


    return view;
}

public void InsertItem() {
    countries.add("Smile");
    mAdapter.notifyDataSetChanged();


}

private void CreateExampleList() {
    countries = new ArrayList<String>();
    countries.add("Eat");
    countries.add("Kill");

}





}

This is my CustomAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ArrayList<String> cards;

public MyAdapter(ArrayList<String> countries) {
    this.cards = countries;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, 
false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_country.setText(cards.get(i));
}

@Override
public int getItemCount() {
    return cards.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_country;
    private Button tv_button;
    public ViewHolder(View view) {
        super(view);

        tv_country = (TextView)view.findViewById(R.id.tv_country);

    }
}

}public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ArrayList<String> cards;

public MyAdapter(ArrayList<String> countries) {
    this.cards = countries;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, 
false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_country.setText(cards.get(i));
}

@Override
public int getItemCount() {
    return cards.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_country;
    private Button tv_button;
    public ViewHolder(View view) {
        super(view);

        tv_country = (TextView)view.findViewById(R.id.tv_country);

    }
}

}

And my LogcatText

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView$Adapter.notifyDataSetChanged()' on a null object reference at com.example.barryblack.FragmentPage.InsertItem(FragmentPage.java:60) at com.example.barryblack.FragmentPage$1.onClick(FragmentPage.java:43)

obri
  • 11
  • 6
  • `MyAdapter adapter = new MyAdapter(countries);` – IntelliJ Amiya Apr 05 '20 at 17:27
  • So I switcheed Recycler.Adapter with yours but I still get the Same Error and the apps still crashes – obri Apr 05 '20 at 17:34
  • You never assign `mAdapter` anywhere, so it's null in `InsertItem()`. Change `RecyclerView.Adapter adapter = new MyAdapter(countries);` to `mAdapter = new MyAdapter(countries);`. Note that there is no type at the beginning of that line. – Mike M. Apr 05 '20 at 19:42
  • 1
    Thank you so much for your help I was able to get it done :D – obri Apr 07 '20 at 20:54

1 Answers1

0

this code private RecyclerView.Adapter mAdapter;

must be private MyAdapter mAdapter;

and this RecyclerView.Adapter adapter = new MyAdapter(countries);

to this MyAdapter mAdapter = new MyAdapter(countries);

Ade Dyas
  • 53
  • 8
  • I don't wanna be that guy but it still crashes. I still get this Logcat error void com.example.barryblack.MyAdapter.notifyDataSetChanged()' on a null object reference. I really think the error is inside the insert Item method. None the less I'm still very thankful for you quick answer. – obri Apr 05 '20 at 17:40
  • i think u must move your initial variable to onviewcreated. let oncreateview just declare your layout – Ade Dyas Apr 05 '20 at 17:50