0

I'm am trying to open a new fragment by selecting the image from the card view within the recycler view. Preferable using both adapter and fragment classes. How do I do that?

This is my adapter class:

public class CorporateAdapter extends RecyclerView.Adapter {

private int[] images = {
        R.drawable.sample1,
        R.drawable.sample2
};

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

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

    ((MyViewHolder) viewHolder).bindView(i);
}

@Override
public int getItemCount() {
    return images.length;
}

private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    private ImageView mImageView;

    public MyViewHolder(View itemView) {
        super(itemView);
        mImageView = (ImageView) itemView.findViewById(R.id.showImage);
        mImageView.setOnClickListener(this);

    }

    public void bindView(int position) {

        mImageView.setImageResource(images[position]);

    }

    @Override
    public void onClick(View v) {
    }
}

This is my Fragment class:

public class CorporateFragment extends Fragment {

private final int LAYOUT_LISTCORPORATE_FRAGMENT = R.layout.corporate_membership;

private View v;
private Date date;

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;

public CorporateFragment() {

}

public static CorporateFragment newInstance(Date date) {
    CorporateFragment fragment = new CorporateFragment();
    Bundle args = new Bundle();
    //args.putSerializable(ARG_DATE,date);
    fragment.setArguments(args);
    return fragment;
}

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

    // Inflate the layout for this fragment
    v = inflater.inflate(LAYOUT_LISTCORPORATE_FRAGMENT, container, false);
    ButterKnife.bind(this, v);

    return v;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

    recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
    final CorporateAdapter listAdapter = new CorporateAdapter();
    recyclerView.setAdapter(listAdapter);
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

}

I've seen some ways where by we can open up the new fragment straight from the adapter, but the more correct way would be having the Onclicklistener in both the fragment class and adapter class.

Is there any way I could do that? Thank you

Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300

1 Answers1

0

Here is An example for You paste as it is. Make constructor which will have an interface as parameter in adapter and override it in Fragment.

Your Fragment Code will look like this.

public class CorporateFragment extends Fragment {

    private final int LAYOUT_LISTCORPORATE_FRAGMENT = R.layout.corporate_membership;

    private View v;
    private Date date;

    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;

    public CorporateFragment() {

    }

    private int[] images = {
            R.drawable.sample1,
            R.drawable.sample2
    };

    public static CorporateFragment newInstance(Date date) {
        CorporateFragment fragment = new CorporateFragment();
        Bundle args = new Bundle();
        //args.putSerializable(ARG_DATE,date);
        fragment.setArguments(args);
        return fragment;
    }

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

        // Inflate the layout for this fragment
        v = inflater.inflate(LAYOUT_LISTCORPORATE_FRAGMENT, container, false);
        ButterKnife.bind(this, v);

        return v;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
        final CorporateAdapter listAdapter = new CorporateAdapter(getActivity(), images, new CorporateAdapter.onItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                /////////////////// do your on Click Stuff here...
                /////////// for ex .. go to next fragment
            }
        });
        recyclerView.setAdapter(listAdapter);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

    }
}

And Your adapter is set to go like this

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

     Context context;
     private int[] images;
     onItemClickListener onItemClickListener;

     public CorporateAdapter(Context context, int[] images, CorporateAdapter.onItemClickListener onItemClickListener) {
         this.context = context;
         this.images = images;
         this.onItemClickListener = onItemClickListener;
     }

     @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.corporate_list_row, viewGroup, false);
        final MyViewHolder vHold = new MyViewHolder(view);
        return vHold;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {


        ((MyViewHolder) holder).bindView(position);

        holder.mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onItemClickListener.onItemClick(view,position);
            }
        });

    }


    @Override
    public int getItemCount() {
        return images.length;
    }

    private class MyViewHolder extends RecyclerView.ViewHolder {

        private ImageView mImageView;

        public MyViewHolder(View itemView) {
            super(itemView);
            mImageView = (ImageView) itemView.findViewById(R.id.showImage);

        }

        public void bindView(int position) {

            mImageView.setImageResource(images[position]);

        }

    }

    public interface onItemClickListener{
        void onItemClick(View view , int position);
    }
}

Hope it will help. Good Luck

flashberry
  • 153
  • 11