0

I have a fragment running that has part of its layout view load a RecyclerView Card. From within this card I want to launch a new fragment that opens a full screen layout.

public class MemoriesFragment extends Fragment {

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

    MemListFragment fragment = new MemListFragment();
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.placeholder, fragment);
    fragmentTransaction.commit();
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_authoring_memory_menu_1, container, false);

    return view;
}}

That's the main fragment. The next one is the fragment that creates and populates the RecyclerView

public class MemListFragment extends Fragment  {

ImageButton button1;

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_authoring_memory_list, container,false);

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

    ListAdapter listAdapter = new ListAdapter();
    recyclerView.setAdapter(listAdapter);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

    button1 = view.findViewById(R.id.memory_image);

    return view;

}}

This is the RecyclerView

    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    private LayoutInflater layoutInflater;
    private List<String> data;
    public ImageButton memory_image;

    public Adapter(MemoriesFragment Context, List<String> data){
       // this.layoutInflater = LayoutInflater.from();
        this.data = data;
   }

@NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = layoutInflater.inflate(R.layout.memory_view,viewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        // bind the textview with data received

        String title = data.get(i);
        viewHolder.textTitle.setText(title);
        // similarly you can set new image for each card and descriptions
        viewHolder.memoryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                Fragment MemoryDetails = new MemoryDetails();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.placeholder, MemoryDetails).addToBackStack(null).commit();
            }
        });
    }
    @Override
    public int getItemCount() {
        return data.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder  {
        // Define UI components here
        TextView textTitle;
        ImageButton memoryButton;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textTitle = itemView.findViewById(R.id.textTitle);
            memoryButton = itemView.findViewById(R.id.memory_image);
        }
    }
}

The recylerview is created with memory_view.xml which just has text and an imagebutton named memory_image. When I run this code it crashes when I click the Image Button.

Edit: added error log below

2020-02-21 16:50:29.334 19558-19558/com.app.emotivo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.emotivo, PID: 19558
java.lang.IllegalStateException: Could not find method onClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatImageButton with id 'memory_image'
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:434)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:391)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

2 Answers2

0

i am not sure if it works but can you try using supportfragmentmanager in the memories fragment too , and cast your the the result of itemView.findViewById(R.id.memory_image)to an ImageButton like that (ImageButton)itemView.findViewById(R.id.memory_image)

Abhinav Chauhan
  • 1,304
  • 1
  • 7
  • 24
0

the display of the fragment inside the adapter is not a good thing. I think first of all use the navigation on Android Jetpack Or use RxJava and transfer the formatting representation from adapter to fragment.