skip to Main Content

How to call Fragment method from RecyclerView layoutmanager?
Here are my Adapter:

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
    private ArrayList<ExampleItem> mExampleList  ;
    public static class ExampleViewHolder extends RecyclerView.ViewHolder{
        public ImageView mImageView;
        public TextView mTextView1;
        public TextView mTextView2;
        public TextView mTextView3;
        public TextView mTextView4;

        public ExampleViewHolder(@NonNull View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.Icon_homework);
            mTextView1 = itemView.findViewById(R.id.Line_1);
            mTextView2 = itemView.findViewById(R.id.Line_2);
            mTextView3 = itemView.findViewById(R.id.line_3);
            mTextView4 = itemView.findViewById(R.id.line_4);

        }
    }

    public ExampleAdapter(ArrayList<ExampleItem> exampleList){
        mExampleList = exampleList;
    }

    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_stundenplan, parent, false);
        ExampleViewHolder evh = new ExampleViewHolder(v);
        return evh;
    }

    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
        ExampleItem currentitem = mExampleList.get(position);

        holder.mImageView.setImageResource(currentitem.getImageRessource());
        holder.mTextView1.setText(currentitem.getText1());
        holder.mTextView2.setText(currentitem.getText2());
        holder.mTextView3.setText(currentitem.getText3());
        holder.mTextView4.setText(currentitem.getText4());

    }

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

Here are my Items:

public class ExampleItem   {
    private int mImageRessource;
    private String mText1;
    private String mText2;
    private String mText3;
    private String mText4;

    public ExampleItem(int imageRessource, String text1, String text2, String text3, String text4){
        mImageRessource = imageRessource;
        mText1 = text1;
        mText2 = text2;
        mText3 = text3;
        mText4 = text4;
    }

    public int getImageRessource(){
        return mImageRessource;
    }

    public String getText1(){
        return mText1;
    }

    public String getText2(){
        return mText2;
    }

    public String getText3(){
        return mText3;
    }

    public String getText4(){
        return mText4;
    }

}

And here are my Fragment code, i tried to find the problem, because when i open the app and click on the Fragmnet, it automatically close the app, and I think it is up to the layout manager and/or the Adapter.

public class StundenplanFragment extends Fragment {

    private RecyclerView mrecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public StundenplanFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment StundenplanFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static StundenplanFragment newInstance(String param1, String param2) {
        StundenplanFragment fragment = new StundenplanFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<ExampleItem> exampleList = new ArrayList<>();
        exampleList.add(new ExampleItem(R.drawable.backpack, "Fach", "7:50-9:30", "2.0", "Raum:15"));



        mAdapter = new ExampleAdapter(exampleList);
        mLayoutManager = new LinearLayoutManager(getContext());

        mrecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mrecyclerView.setAdapter(mAdapter);
        //mAdapter.notifyDataSetChanged();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

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

        mrecyclerView= view.findViewById(R.id.recyclerview);
        return view;
        //recyclerView.setHasFixedSize(true);
        //return inflater.inflate(R.layout.fragment_stundenplan, container, false);
    }


}

2

Answers


  1. pass fragment to the recyclerview constructor

       public ExampleAdapter(ArrayList<ExampleItem> exampleList,Fragment fragment){
        mExampleList = exampleList;
        this.fragment=fragment;
    }
    

    and when you need to call the method

    if(fragment instanceOf StundenplanFragment ){
    ((StundenplanFragment)fragment).methodName());
    }
    
    Login or Signup to reply.
  2. the method onCreate being called before onCreateView
    so basically in the fragment your trying to set the recyclerView adapter before the recyclerView created

    so your fragment should look like this:

    public class StundenplanFragment extends Fragment {
    
        // declaring the list in order to use it again in 'onCreateView'
        private ArrayList<ExampleItem> exampleList = new ArrayList<>();
        private RecyclerView mrecyclerView;
        private RecyclerView.Adapter mAdapter;
        private RecyclerView.LayoutManager mLayoutManager;
    
        // TODO: Rename parameter arguments, choose names that match
        // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
        private static final String ARG_PARAM1 = "param1";
        private static final String ARG_PARAM2 = "param2";
    
        // TODO: Rename and change types of parameters
        private String mParam1;
        private String mParam2;
    
        public StundenplanFragment() {
            // Required empty public constructor
        }
    
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment StundenplanFragment.
         */
        // TODO: Rename and change types and number of parameters
        public static StundenplanFragment newInstance(String param1, String param2) {
            StundenplanFragment fragment = new StundenplanFragment();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, param1);
            args.putString(ARG_PARAM2, param2);
            fragment.setArguments(args);
            return fragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            exampleList.add(new ExampleItem(R.drawable.backpack, "Fach", "7:50-9:30", "2.0", "Raum:15"));
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
    
            View view = inflater.inflate(R.layout.fragment_stundenplan, container, false);
    
            mrecyclerView= view.findViewById(R.id.recyclerview);
    
            mAdapter = new ExampleAdapter(exampleList);
            mLayoutManager = new LinearLayoutManager(getContext());
    
            mrecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            mrecyclerView.setAdapter(mAdapter);
            //mAdapter.notifyDataSetChanged();
    
            return view;
            //recyclerView.setHasFixedSize(true);
            //return inflater.inflate(R.layout.fragment_stundenplan, container, false);
        }
    
    
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search