Roeben Pierce
Roeben Pierce

Reputation: 3

RecyclerView in Fragment – How to retrieve data from an Array List

So I saw this tutorial that creates a recyclerview in fragments of navigation drawer. In this tutorial, the data is stored in an array. What I am trying to do right now is to store the data in an ArrayList.

Here is my code in ‘Tutor’ Fragment:

   public class Tutors extends Fragment
{
    View myView;
    private ArrayList<TutorModel> tutorModelList = new ArrayList<>();
    private RecyclerView recyclerView;
    private MyAdapter tutorAdapter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getTutorData();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.admin_manage_tutors,
                container, false);
        recyclerView = myView.findViewById(R.id.recycler_view);

        tutorAdapter = new MyAdapter(tutorModelList);
        RecyclerView.LayoutManager mLayoutManager = new
                LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(tutorAdapter);
        return myView;
    }


    public void getTutorData()
    {
        TutorModel tutor = new TutorModel("Juan", "Computer Programming");
        tutorModelList.add(tutor);

        tutor = new TutorModel("Santiago", "French History");
        tutorModelList.add(tutor);

        tutor = new TutorModel("Jose", "Philippine History");
        tutorModelList.add(tutor);

        tutorAdapter.notifyDataSetChanged();

    }
}

This is the code of my Adapter:

public class MyAdapter extends
        RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    public List<TutorModel> tutorList;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView name, subjects;

        public MyViewHolder(View view) {
            super(view);
            name = view.findViewById(R.id.name_tutor);
            subjects = view.findViewById(R.id.subjects_tutor);
        }
    }


    public MyAdapter(List<TutorModel> tutorList) {
        this.tutorList = tutorList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.tutor_list, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        TutorModel tutor = tutorList.get(position);
        holder.name.setText(tutor.getTutorName());
        holder.subjects.setText(tutor.getTutorSubject());
    }

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

And this is my getter/setter code:

public class TutorModel
{
    String tutorName, tutorSubject;

    public String getTutorName() {
        return tutorName;
    }

    public void setTutorName(String tutorName) {
        this.tutorName = tutorName;
    }

    public String getTutorSubject() {
        return tutorSubject;
    }

    public void setTutorSubject(String tutorSubject) {
        this.tutorSubject = tutorSubject;
    }

    public TutorModel(String tutorName, String tutorSubject) {
        this.tutorName = tutorName;
        this.tutorSubject = tutorSubject;
    }

    public TutorModel() {
    }
}

When I try to run the app, it crashes.

Upvotes: 0

Views: 1234

Answers (2)

Santanu Sur
Santanu Sur

Reputation: 11477

You have initialized your tutorAdapter in onCreateView() but onCreate gets called before onCreateView so your adapter is null..just edit your onCreate like the code below..

@Override
   public void onCreate(@Nullable Bundle         savedInstanceState)  
     {  super.onCreate(savedInstanceState);
         tutorAdapter = new MyAdapter(tutorModelList);
        getTutorData(); }

Upvotes: 0

Pavneet_Singh
Pavneet_Singh

Reputation: 37404

onCreateView will be invoked after onCreate but getTutorData(); is notifying the adapter which is yet to be initialized by onCreateView so initialize your adapter before getTutorData(); method call

or better way is call getTutorData inside onCreateView

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.admin_manage_tutors,
            container, false);
    recyclerView = myView.findViewById(R.id.recycler_view);

    tutorAdapter = new MyAdapter(tutorModelList);
    RecyclerView.LayoutManager mLayoutManager = new
            LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(tutorAdapter);
    getTutorData();
    return myView;
}

Upvotes: 1

Related Questions