0

I have a RecyclerView, it has items in it. I need each item to have its own Activity, that is, we have item1 by clicking on it, Activity1 opens, there is also item2 about clicking on it, Activity2 is opened. Can this be done somehow? If so, how? I managed to make it so that when I clicked, the same Fragment opened, and the text changes depending on which item was clicked. But it doesn't quite suit me.

Fragment where the RecyclerView is located

public class FragmentAttractionRecyclerView extends Fragment {
    
    private RecyclerView mRec;
    private AttractionsAdapter adapter;
    private ArrayList<AttractionsItem> exampleList;
    
    private RecyclerView.LayoutManager mLayoutManager;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_attraction_test_2, container, false);

    }

    @SuppressLint("InflateParams")
    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
        createExampleList();
        buildRecyclerView();
    }

    public void createExampleList() {
        exampleList = new ArrayList<>();
        exampleList.add(new AttractionsItem(R.mipmap.unnamed, R.drawable.ic_kid, "Baby островок", "Детский", "60₽","Максимальное кол-во детей","10","Возраст","С 1-го до 6 лет"));
        exampleList.add(new AttractionsItem(R.mipmap.unnamed, R.drawable.ic_kid, "Виражи", "Детский", "80₽","Максимальное кол-во пассажиров","24", "Возраст","От 4-х до 12 лет"));
        exampleList.add(new AttractionsItem(R.mipmap.unnamed, R.drawable.ic_kid, "Вокруг света", "Детский", "50₽","Максимальное кол-во пассажиров","12","Возраст","От 3-х до 12 лет"));
        exampleList.add(new AttractionsItem(R.mipmap.unnamed, R.drawable.ic_interactive, "5D кинотеатр", "Интерактивный", "120₽","Максимальное кол-во пассажиров","","Возраст","С 6 лет"));
   }

    public void buildRecyclerView() {
        mRec = requireView().findViewById(R.id.attraction_recycler);
        adapter = new AttractionsAdapter(exampleList);
        mLayoutManager = new LinearLayoutManager(getContext());
        mRec.setLayoutManager(mLayoutManager);
        mRec.setAdapter(adapter);
    }
}

Adapter for RecyclerView

public class AttractionsAdapter extends RecyclerView.Adapter<AttractionsAdapter.AttractionsViewHolder> {
    public ArrayList<AttractionsItem> mFavList;

    public AttractionsAdapter(ArrayList<AttractionsItem> favList) {
        mFavList = favList;
    }

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

    }

    public static class AttractionsViewHolder extends RecyclerView.ViewHolder {
        public ImageView card_image_1, card_image_2;
        public TextView card_text_1, card_text_2, card_text_3,attraction_menu_1_1,attraction_menu_1_2;
        public CardView Card;

        public AttractionsViewHolder(View itemView) {
            super(itemView);
            card_image_1 = itemView.findViewById(R.id.card_image_1);
            card_image_2 = itemView.findViewById(R.id.card_image_2);
            card_text_1 = itemView.findViewById(R.id.card_text_1);
            card_text_2 = itemView.findViewById(R.id.card_text_2);
            card_text_3 = itemView.findViewById(R.id.card_text_3);
            attraction_menu_1_1 = itemView.findViewById(R.id.attraction_menu_1_1);
            attraction_menu_1_2 = itemView.findViewById(R.id.attraction_menu_1_2);
            Card = itemView.findViewById(R.id.Card);

        }
    }

    @Override
    public void onBindViewHolder(AttractionsViewHolder holder, int position) {
        AttractionsItem currentItem = mFavList.get(position);
        holder.card_image_1.setImageResource(currentItem.getImg1());
        holder.card_image_2.setImageResource(currentItem.getImg2());
        holder.card_text_1.setText(currentItem.get_attraction_name());
        holder.card_text_2.setText(currentItem.get_attraction_type());
        holder.card_text_3.setText(currentItem.get_attraction_cost());



        holder.Card.setOnClickListener(v -> {
            FragmentBlancAttraction fragment = new FragmentBlancAttraction(); // you fragment
            FragmentManager fragmentManager = ((FragmentActivity) v.getContext()).getSupportFragmentManager(); // instantiate your view context
            Bundle bundle = new Bundle();
            bundle.putString("name", currentItem.get_attraction_name());
            bundle.putString("menu_1_1", currentItem.get_attraction_menu_1_1());
            bundle.putString("menu_1_2", currentItem.get_attraction_menu_1_2());
            bundle.putString("menu_2_1", currentItem.get_attraction_menu_2_1());
            bundle.putString("menu_2_2", currentItem.get_attraction_menu_2_2());
            fragment.setArguments(bundle);
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.setCustomAnimations(R.animator.nav_default_enter_anim, R.animator.nav_default_exit_anim,
                    R.animator.nav_default_pop_enter_anim, R.animator.nav_default_pop_exit_anim);
            fragmentTransaction.replace(R.id.fragment, fragment);// your container and your fragment
            fragmentTransaction.addToBackStack("tag");
            fragmentTransaction.commit();
        });


    }

    @Override
    public int getItemCount() {
        return mFavList.size();
    }
}
public class AttractionsItem
{
    private int mImg_1,mImg_2;
    private final String mText_attraction_name;
    private final String mText_attraction_type;
    private final String mText_attraction_cost;
    private final String mText_attraction_menu_1_1;
    private final String mText_attraction_menu_1_2;
    private final String mText_attraction_menu_2_1;
    private final String mText_attraction_menu_2_2;
    public AttractionsItem(int img1,int img2, String text_attraction_name, String text_attraction_type, String text_attraction_cost, String text_attraction_menu_1_1, String text_attraction_menu_1_2, String text_attraction_menu_2_1, String text_attraction_menu_2_2)
    {
        mImg_1 = img1;
        mImg_2 = img2;

        mText_attraction_name = text_attraction_name;
        mText_attraction_type = text_attraction_type;
        mText_attraction_cost = text_attraction_cost;
        mText_attraction_menu_1_1 = text_attraction_menu_1_1;
        mText_attraction_menu_1_2 = text_attraction_menu_1_2;
        mText_attraction_menu_2_1 = text_attraction_menu_2_1;
        mText_attraction_menu_2_2 = text_attraction_menu_2_2;
    }
    public int getImg1()
    {
        return mImg_1;
    }
    public int getImg2()
    {
        return mImg_2;
    }
    public String get_attraction_name()
    {
        return mText_attraction_name;
    }
    public String get_attraction_type()
    {
        return mText_attraction_type;
    }
    public String get_attraction_cost()
    {
        return mText_attraction_cost;
    }
    public String get_attraction_menu_1_1()
    {
        return mText_attraction_menu_1_1;
    }
    public String get_attraction_menu_1_2()
    {
        return mText_attraction_menu_1_2;
    }
    public String get_attraction_menu_2_1()
    {
        return mText_attraction_menu_2_1;
    }
    public String get_attraction_menu_2_2()
    {
        return mText_attraction_menu_2_2;
    }
}
  • `Can this be done somehow? If so, how?` yes, it can be done. add callbacks to every item and handle the callbacks as they are invoked – a_local_nobody Dec 04 '20 at 11:39
  • Does this answer your question? [RecyclerView onClick](https://stackoverflow.com/questions/24471109/recyclerview-onclick) – a_local_nobody Dec 04 '20 at 11:40

1 Answers1

0

The positon param inside onBindViewHolder() method tells you which item of your RecyclerView clicked. Use this to control your program and in out of onBindViewHolder() method you can get your item position by getAdapterPosition().

holder.Card.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (position) {
            case 0: {
                // Start first activity.
                break;
            }
            case 1: {
                // Start Second activity.
                break;
            }
        }
    }
});
Son Truong
  • 13,661
  • 5
  • 32
  • 58
  • It worked, but when sorting `items`, the `position` does not change, can I somehow bind `onClick` to the `item` `position`? –  Dec 05 '20 at 05:53
  • You can add a variable to your `AttractionsItem` model class and set the value to your object of it before adding them to your `exampleList`, so handle them into `setOnClickListener` by our new variable of `AttractionsItem` model. – Amin Qayyum98 Dec 05 '20 at 06:46
  • How to write the code for such an action correctly? Could you please help me with the correct spelling? I just don't quite understand how to do this. –  Dec 05 '20 at 08:08