简体   繁体   中英

Getting RecyclerView.Adapter List from ViewHolder

Is any way to transfer the current list of items to a new Activity using OnClickListener of ViewHolder ? Or any other way?

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.EventsViewHolder> {
    List<Event> events; //get this List
    RVAdapter(List<Event> events) {
        this.events = events;
}

public static class EventsViewHolder extends RecyclerView.ViewHolder {

    TextView date;
    TextView text;
    ImageView photo;

    EventsViewHolder(final View itemView) {
        super(itemView);
        date = (TextView) itemView.findViewById(R.id.date);
        text = (TextView) itemView.findViewById(R.id.text);
        photo = (ImageView) itemView.findViewById(R.id.photo);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                SendObject sendObject = new SendObject(setList); //and transfer it here
                Intent intent = new Intent(context, ReadEvent.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("events", sendObject);
                bundle.putInt("pos", getAdapterPosition());
                bundle.putString("test", "test");
                intent.putExtras(bundle);
                context.startActivity(intent);
            }
        });
    }
}

Solution 1: Create method in ViewHolder in which you pass your list

Solution 2: Define your ViewHolder as not static class and pass your list

Another approach:

    // Solution 1:
    public class EventsViewHolder extends RecyclerView.ViewHolder {

            EventsViewHolder(final View itemView) {
                super(itemView);
            }

            public void bind(List<Event> events) {
                ...
                SendObject sendObject = new SendObject(events); //and transfer it here
                ...
            }
        }

    // Solution 2:
    public class EventsViewHolder extends RecyclerView.ViewHolder {
        EventsViewHolder(final View itemView) {
            super(itemView);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SendObject sendObject = new SendObject(events); //and transfer it here
                }
            });
        }
    }

Adapter Class.

public ServicesHomeAdapter(Context context, ArrayList<HomeScreenData> homeScreenDataArrayList,OnItemClickedListener listener) {
    this.context=context;
    this.homeScreenDataArrayList=homeScreenDataArrayList;
    this.listener=listener;
}

@Override
public ServicesHomeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{

    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_service,parent,false);
    ViewHolder viewHolder=new ViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(final ServicesHomeAdapter.ViewHolder holder, int position) {

    final HomeScreenData homeScreenData = homeScreenDataArrayList.get(position);

}

@Override
public int getItemCount()
{
    return (null!=homeScreenDataArrayList?homeScreenDataArrayList.size():0);
}


public class ViewHolder extends RecyclerView.ViewHolder {
    protected ImageView ivSection;
    protected TextView txImageName;


    public ViewHolder(View itemView)
    {
        super(itemView);
        this.ivSection= (ImageView) itemView.findViewById(R.id.ivcard);
        this.txImageName= (TextView) itemView.findViewById(R.id.txtimgname);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClicked(getAdapterPosition());
            }
        });
    }
}

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

}

Implement the interface in your Activity.

@Override
public void onItemClicked(int position) {
    Intent intent = new Intent(getActivity(), A.class);
    Pojo Class pojo = arrayList.get(position);
    intent.putExtra(TAG, pojo);
    startActivity(intent);

}`

Your Pojo should parseable or serialised but now android recommends to implement parseable then you can pass any Pojo through intent, How you can make your class parseable check this link. https://developer.android.com/reference/android/os/Parcelable.html intent.putExtra(key, Serializable/Parcelable) and then in second activity getParcelableExtra(key)/getSerializableExtra(key)

I had a Serializable object already:

public class SendObject implements Serializable{

private List<Event> events;

public SendObject(List<Event> events) {
    this.events = events;
}

public List<Event> getEvents() {
    return events;
}

}

The main problem was to receive current Adapter List. The problem is solved by using Singleton. The solution was simple.

public class RVAdapter extends RecyclerView.Adapter {

private static RVAdapter rvAdapter;
private List<Event> events;

public RVAdapter() {
}

public static RVAdapter getInstance() {
    if (rvAdapter==null) {
        rvAdapter = new RVAdapter();
    }
    return rvAdapter;
}


public void setList(List<Event> events) {
    this.events = events;
}

public static class EventsViewHolder extends RecyclerView.ViewHolder {

    TextView date;
    TextView text;
    ImageView photo;

    EventsViewHolder(final View itemView) {
        super(itemView);
        date = (TextView) itemView.findViewById(R.id.date);
        text = (TextView) itemView.findViewById(R.id.text);
        photo = (ImageView) itemView.findViewById(R.id.photo);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                SendObject sendObject = null;
                sendObject = new SendObject(RVAdapter.getInstance().events);  //current List
                Intent intent = new Intent(context, ReadEvent.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("events", sendObject);
                bundle.putInt("pos", getAdapterPosition());
                intent.putExtras(bundle);
                context.startActivity(intent);
            }
        });
    }
}

Anyway, thanks for your responses!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM