0

I have created a RecyclerView and added cards.I want to open different activity by clicking on different cards.

My codes are:

MainActivity

public class MainActivity extends AppCompatActivity {
    RecyclerView mRecyclerView;
    RecyclerView.LayoutManager mLayoutManager;
    RecyclerView.Adapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new CardAdapter();
        mRecyclerView.setAdapter(mAdapter); }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

CardAdapter

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

    List<NatureItem> mItems;

    public CardAdapter() {
        super();
        mItems = new ArrayList<NatureItem>();
        NatureItem nature = new NatureItem();
        nature.setName("The Great Barrier Reef");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);

        nature = new NatureItem();
        nature.setName("Grand Canyon");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);

        nature = new NatureItem();
        nature.setName("Baltoro Glacier");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);

        nature = new NatureItem();
        nature.setName("Iguazu Falls");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);


        nature = new NatureItem();
        nature.setName("Aurora Borealis");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.recycler_view_card_item, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        NatureItem nature = mItems.get(i);
        viewHolder.tvNature.setText(nature.getName());
        viewHolder.tvDesNature.setText(nature.getDes());
        viewHolder.imgThumbnail.setImageResource(nature.getThumbnail());
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView imgThumbnail;
        public TextView tvNature;
        public TextView tvDesNature;

        public ViewHolder(View itemView) {
            super(itemView);
            imgThumbnail = (ImageView) itemView.findViewById(R.id.img_thumbnail);
            tvNature = (TextView) itemView.findViewById(R.id.tv_nature);
            tvDesNature = (TextView) itemView.findViewById(R.id.tv_des_nature);
        }
    }
}

NatureItem

public class NatureItem {
    private String mName;
    private String mDes;
    private int mThumbnail;

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        this.mName = name;
    }

    public String getDes() {
        return mDes;
    }

    public void setDes(String des) {
        this.mDes = des;
    }

    public int getThumbnail() {
        return mThumbnail;
    }

    public void setThumbnail(int thumbnail) {
        this.mThumbnail = thumbnail;
    }
}

XML files are normal. RecyclerView in activity_main.xml and one xml for card view

V-rund Puro-hit
  • 5,518
  • 9
  • 31
  • 50
  • Simple. in your array list items add a new item (eg activity = "the_activity_class"), with the activity class you want to open. then in your onClick listener pick up the new item and start that Activity – Tasos Nov 01 '15 at 13:57

3 Answers3

2

Create listener for each "Card" as specified here.

As for opening different activity from different cards I would suggest each card (in this case "NatureItem") to keep Class of an activity that should be started.

You would be able to do:

Intent intent = new Intent(context, nature.getClass());
context.startActivity(intent);
Community
  • 1
  • 1
JuliusScript
  • 3,850
  • 1
  • 17
  • 17
0

In your adapter's ViewHolder class add this:

public ViewHolder(View itemView) {
    super(itemView);
    .....
    .....

    itemView.setOnClickListener(new View.OnClickListener(){
         // Start your activity
    });
}
V-rund Puro-hit
  • 5,518
  • 9
  • 31
  • 50
Mohammed Aouf Zouag
  • 17,042
  • 4
  • 41
  • 67
  • If I do this I will be able to open one activity by clicking on every cards.I want to open different activities by clicking on different cards. Also I am not able to open new Activity inside Constructor – Anubhav Jha Nov 02 '15 at 17:51
0

NatureItem .java

class NatureItem {
    private String name;
    private String des;
    private int setThumbnail;
    private int activityType; //1...n
    //its methods
    public int getActivityType(){
        return activityType;
    }

    public void setSetThumbnail(int setThumbnail) {
        this.setThumbnail = setThumbnail;
    }

    public void setActivityType(int activityType){
        this.activityType = activityType;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDes(String des) {
        this.des = des;
    }

    public String getName() {
        return name;
    }

    public String getDes() {
        return des;
    }

    public int getThumbnail() {
        return setThumbnail;
    }
}

ViewHolder.java

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    public ImageView imgThumbnail;
    public TextView tvNature;
    public TextView tvDesNature;
    Callbacks callbacks;
    View itemView;
    public interface Callbacks{
        public void onItemSelect(View v,int position);
    }
    public ViewHolder(View itemView,Callbacks callbacks) {
        super(itemView);
        this.itemView = itemView;
        this.callbacks = callbacks;
        imgThumbnail = (ImageView) itemView.findViewById(R.id.img_thumbnail);
        tvNature = (TextView) itemView.findViewById(R.id.tv_nature);
        tvDesNature = (TextView) itemView.findViewById(R.id.tv_des_nature);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(callbacks!=null){
            callbacks.onItemSelect(itemView,getAdapterPosition());
        }
    }
}

CardAdapter .java

class CardAdapter extends RecyclerView.Adapter<ViewHolder> {

    List<NatureItem> mItems;
    ViewHolder.Callbacks callbacks;

    public CardAdapter(ViewHolder.Callbacks callbacks) {
        super();
        this.callbacks = callbacks;
        mItems = new ArrayList<NatureItem>();
        NatureItem nature = new NatureItem();
        nature.setName("The Great Barrier Reef");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);

        nature = new NatureItem();
        nature.setName("Grand Canyon");
        nature.setActivityType(1); //activity type
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);

        nature = new NatureItem();
        nature.setName("Baltoro Glacier");
        nature.setActivityType(2);
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);

        nature = new NatureItem();
        nature.setName("Iguazu Falls");
        nature.setActivityType(3);
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);


        nature = new NatureItem();
        nature.setName("Aurora Borealis");
        nature.setDes("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +
                "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.");
        nature.setThumbnail(R.drawable.tag_logo);
        mItems.add(nature);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.recycler_view_card_item, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v, callbacks);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        NatureItem nature = mItems.get(i);
        viewHolder.tvNature.setText(nature.getName());
        viewHolder.tvDesNature.setText(nature.getDes());
        viewHolder.imgThumbnail.setImageResource(nature.getThumbnail());
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }
    public NatureItem getItem(int pos){
        return mItems.get(pos);
    }
}

MainActivity.java

class MainActivity extends AppCompatActivity implements ViewHolder.Callbacks{
    RecyclerView mRecyclerView;
    RecyclerView.LayoutManager mLayoutManager;
    CardAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new CardAdapter(this);
        mRecyclerView.setAdapter(mAdapter);
    }

    @Override
    public void onItemSelect(View v, int position) {
        NatureItem natureItem = mAdapter.getItem(position);
        if (natureItem.getActivityType() == 1) {
            //start this activity
        } else if (natureItem.getActivityType() == 2) {
            //start this activity
        }
    }
}
V-rund Puro-hit
  • 5,518
  • 9
  • 31
  • 50
Vishal Gaur
  • 658
  • 6
  • 18
  • When I tried to implement your code I got few errors, 1. The callback wasn't recognised 2. When you are declaring mAdapter in main activity you are using mAdapter = new CardAdapter(this); but in CardAdapter class constructor is defined as public CardAdapter(ViewHolder.Callbacks callbacks), So it doesn't recognise the pattern – Anubhav Jha Nov 02 '15 at 17:26
  • 3. In main Activity public void onClick(int natureItemPos) { NatureItem natureItem = mAdapter.getItemId(natureItemPos); if (natureItem.getActivityType() == 1) { //start this activity } else if (natureItem.getActivityType() == 2) { //start this activity } } } Error is Error:(35, 51) error: incompatible types: long cannot be converted to NatureItem – Anubhav Jha Nov 02 '15 at 17:31