passing data from on click function of my recycler adaptor

故事扮演 提交于 2021-01-20 07:20:07

问题


 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();

回答1:


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.



来源:https://stackoverflow.com/questions/32323548/passing-data-from-on-click-function-of-my-recycler-adaptor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!