passing data from on click function of my recycler adaptor
Asked Answered
F

1

3
 public void onClick(View v) {
        Intent intent = new Intent(context,notification.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable("DATA",listmsgs.get(getPosition()));
        intent.putExtras(bundle);
        context.startActivity(intent);



    }

in the bundle object i'm getting data of item click and when i'm trying to use this data in notification activity i'm not getting data only one value im getting. or suggest me any another solution

this is my notification activity

 notif data = (notif)getIntent().getExtras().getSerializable("DATA");
    title=data.getTitle();
    tim=data.gettimestamp();
    msg=data.getmsg();
Fike answered 1/9, 2015 at 4:28 Comment(0)
R
6

You need to implement Interface for this. In your adapter class, write below code in the Holder constructor

itemView.setClickable(true);
itemView.setOnClickListener(this);

Now implement OnClickListener to your Holder class. On doing this you will get onClick method.

@Override
public void onClick(View v) {
if (itemClick != null) {
    itemClick.onItemClicked(getPosition());
    }
}

Create one interface class as OnItemClick

public interface OnItemClick {
    public void onItemClicked(int position);
}

And create its object in your adapter class and generate its getter/setter methods too.

Now in your Activity, write below code under binding your RecyclerView with Adapter:

adapter.setItemClick(this);

On doing this you will be asked to implement OnItemClick to your Activity. On implementing onItemClicked, you will be able to perform click event.

@Override
public void onItemClicked(int position) {
    Intent intent = new Intent(context,notification.class);
    Bundle bundle = new Bundle();
    bundle.putSerializable("DATA",listmsgs.get(position));
    intent.putExtras(bundle);
    startActivity(intent);
}

Here is the complete code:

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

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClick {

    private List<Person> persons;

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

        initializeData();

        RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(this));

        RVAdapter adapter = new RVAdapter(persons);
        rv.setAdapter(adapter);
        adapter.setItemClick(this);
    }

    private void initializeData() {
        persons = new ArrayList<>();
        persons.add(new Person("Emma Wilson", "23 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lillie Watts", "35 years old", R.drawable.ic_launcher));
        persons.add(new Person("Emma Wilson", "23 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lillie Watts", "35 years old", R.drawable.ic_launcher));
        persons.add(new Person("Emma Wilson", "23 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lillie Watts", "35 years old", R.drawable.ic_launcher));
        persons.add(new Person("Emma Wilson", "23 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.ic_launcher));
        persons.add(new Person("Lillie Watts", "35 years old", R.drawable.ic_launcher));
    }

    @Override
    public void onItemClicked(int position) {
        Toast.makeText(getBaseContext(), ""+persons.get(position).name, Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(MainActivity.this,Demo.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable("DATA",persons.get(position));
        intent.putExtras(bundle);
        startActivity(intent);
    }

}

Adapter class:

import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
    List<Person> persons;
    private OnItemClick itemClick;

    public class PersonViewHolder extends RecyclerView.ViewHolder implements
            OnClickListener {
        CardView cv;
        TextView personName, personAge;
        ImageView personPhoto;

        PersonViewHolder(View itemView) {
            super(itemView);
            itemView.setClickable(true);
            itemView.setOnClickListener(this);
            cv = (CardView) itemView.findViewById(R.id.cv);
            personName = (TextView) itemView.findViewById(R.id.person_name);
            personAge = (TextView) itemView.findViewById(R.id.person_age);
            personPhoto = (ImageView) itemView.findViewById(R.id.person_photo);
        }

        @SuppressWarnings("deprecation")
        @Override
        public void onClick(View v) {
            if (itemClick != null) {
                itemClick.onItemClicked(getPosition());
            }
        }
    }

    public RVAdapter(List<Person> persons) {
        this.persons = persons;
    }

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

    @Override
    public void onBindViewHolder(PersonViewHolder personViewHolder, int pos) {
        personViewHolder.personName.setText(persons.get(pos).name);
        personViewHolder.personAge.setText(persons.get(pos).age);
        personViewHolder.personPhoto.setImageResource(persons.get(pos).photoId);
    }

    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.item, viewGroup, false);
        PersonViewHolder holder = new PersonViewHolder(view);
        return holder;
    }

    public OnItemClick getItemClick() {
        return itemClick;
    }

    public void setItemClick(OnItemClick itemClick) {
        this.itemClick = itemClick;
    }

}

Model class:

import java.io.Serializable;

@SuppressWarnings("serial")
public class Person implements Serializable {
    String name;
    String age;
    int photoId;

    Person(String name, String age, int photoId) {
        this.name = name;
        this.age = age;
        this.photoId = photoId;
    }
}

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Demo extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Person person = (Person) getIntent().getExtras()
                .getSerializable("DATA");
        Log.e("", "===== " + person.name);
    }
}

xml files:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp" >

    <android.support.v7.widget.CardView
        android:id="@+id/cv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp" >

            <ImageView
                android:id="@+id/person_photo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginEnd="16dp"
                android:layout_marginRight="16dp"
                android:contentDescription="@string/app_name" />

            <TextView
                android:id="@+id/person_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_toEndOf="@+id/person_photo"
                android:layout_toRightOf="@+id/person_photo"
                android:textSize="30sp" />

            <TextView
                android:id="@+id/person_age"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/person_name"
                android:layout_toEndOf="@+id/person_photo"
                android:layout_toRightOf="@+id/person_photo" />
        </RelativeLayout>
    </android.support.v7.widget.CardView>

</LinearLayout>

Add recyclerview and cardview external libs to your project.

Roman answered 1/9, 2015 at 4:55 Comment(9)
thanks jignesh,in my adapter class , very thing is fine am able to get the data of select item in bundle object when i debuged the code but in my notification activity am not getting data it is showing null.Fike
listmsgs is of string or any model class, if its of model class than you need to serialize that model class by implementing serializableRoman
Than you must get the data as i am getting data, its working fine..Can you post your notif class?Roman
Are you doing the same way which i have done or still calling notification class from your adapter?Roman
public class notif implements Serializable { private String title; private String uimg_url; public notif() { public String getTitle() { return title; }public void setTitle(String title) { this.title = title; }public String getuimg_url() { return uimg_url; } public void setuimg_url(String uimg_url) { this.uimg_url = uimg_url; }Fike
I will update my answer in few minutes.. You will find the complete code.Roman
hei thanks, its working but am getting only title , not getting another two values as mention about notif classFike
Does anyone know why, adapter.setItemClick(this) doesnt work for me. I cant simply see the setItemClick method in my adapter. Even though i have implemented and followed all the steps mentioned hereSneakers
@JigneshJain need help here --> #64495733Bedtime

© 2022 - 2024 — McMap. All rights reserved.