RahimAris
RahimAris

Reputation: 67

How do I implement multiple intent from each Card from CardView with RecyclerView?

  1. I would like to implement a new intent when my card from CardView is clicked. I have already implemented for one of the cards. Is there any other way in which the adapter is able to identify the position and bring to a new activity for each card? Like linking the each card to their individual activity with a template layout. (The new activity for each card will be of the same layout, just different texts and images).

  2. I have added an ImageButton on my cards. However, when I click on the ImageButton, it does not bring me to the new activity. Clicking on the card edges/portion and not the image itself would work. Is there something I missed out on my code? I can't seem to get it.

Here are my codes:

MuaActivity.java

    package android.com.example.weddingappfinale;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.inputmethod.EditorInfo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

import Adapters.MuaAdapter;
import CustomerActivities.ShimaMatinActivity;

public class MuaActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private MuaAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mua_list);

        getSupportActionBar().setTitle("Make Up Artists");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        final ArrayList<MuaView> muaView = new ArrayList<>();
        muaView.add(new MuaView(R.drawable.mua_image, "Shima Matin Bridal Services"));
        muaView.add(new MuaView(R.drawable.mua_image, "Aake Up Artist Pte Ltd"));
        muaView.add(new MuaView(R.drawable.mua_image, "Lake Up Artist 3Pte Ltd"));
        muaView.add(new MuaView(R.drawable.mua_image, "f Up Artist Pte Ltd"));

        // ArrayList

        mRecyclerView = findViewById(R.id.recycler_view_list);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);
        mAdapter = new MuaAdapter(muaView);

        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        mAdapter.setOnItemClickListener(new MuaAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Intent i = new Intent (MuaActivity.this, ShimaMatinActivity.class);
                startActivity(i);
                finish();
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                mAdapter.getFilter().filter(newText);
                return false;
            }
        });
        return true;
    }
}

MuaAdapter.java

    package Adapters;

import android.com.example.weddingappfinale.MuaView;
import android.com.example.weddingappfinale.R;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MuaAdapter extends RecyclerView.Adapter<MuaAdapter.MuaViewHolder> implements Filterable {
    private ArrayList<MuaView> mMuaView;
    private ArrayList<MuaView> mMuaViewFull;
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }

    public static class MuaViewHolder extends RecyclerView.ViewHolder {
        public ImageButton mImageButton;
        public TextView mTextView1;

        public MuaViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);
            mImageButton = itemView.findViewById(R.id.mua_imageButton);
            mTextView1 = itemView.findViewById(R.id.mua_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(position);
                        }
                    }
                }
            });
        }
    }

    public MuaAdapter(ArrayList<MuaView> muaView) {
        this.mMuaView = muaView;
        mMuaViewFull = new ArrayList<>(muaView);
    }

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

    @Override
    public void onBindViewHolder(@NonNull MuaViewHolder holder, int position) {
        MuaView currentView = mMuaView.get(position);

        holder.mImageButton.setImageResource(currentView.getImageResource());
        holder.mTextView1.setText(currentView.getText1());
    }

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

    public Filter getFilter() {
        return MuaFilter;
    }

    private Filter MuaFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<MuaView> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(mMuaViewFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (MuaView item : mMuaViewFull) {
                    if (item.getText1().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mMuaView.clear();
            mMuaView.addAll((ArrayList) results.values);
            notifyDataSetChanged();

        }
    };
}

Upvotes: 0

Views: 271

Answers (1)

Legend Bard
Legend Bard

Reputation: 161

Answer for first question: You could pass the position of the item to the new activity with intent.putExtra(). In the new activity you can read out the number with intent.getExtra() and setup your layout content as you want depending on the number you got. This way you only have one Activity instead of many. Activity 1

Intent intent = new Intent(this, Shima.class);
intent.putExtra("position_value", position);
startActivity(intent);

Activity 2

Intent intent = getIntent();
int position = intent.getIntExtra("position_value", 0); // 0 is the default value
// set a layout based on position with switch case or if...
switch (position){
   case 1:
         setContentView(R.layout.activity_card_one);
         break;
   case 2:
         setContentView(R.layout.activity_card_two);
         break;
....

Second question: See here.

Basicaly the same way like

itemView.setOnClickListener(new View.OnClickListener() {...

You can set a image depending on what item has been clicked using something like this

private Integer images[] = {R.drawable.pic1, R.drawable.pic2, R.drawable.pic3}

and

imageView.setImageResource(images[position]);

(maybe position -1, not sure if first item in recyclerView is 1 or 0)

Upvotes: 1

Related Questions