簡體   English   中英

從ViewHolder獲取RecyclerView.Adapter列表

[英]Getting RecyclerView.Adapter List from ViewHolder

是否可以使用OnClickListenerViewHolder將當前項目列表傳輸到新的Activity 還是其他方式?

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

解決方案1:在ViewHolder中創建您在其中傳遞列表的方法

解決方案2:將ViewHolder定義為非靜態類,然后傳遞您的列表

另一種方法:

    // 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
                }
            });
        }
    }

適配器類。

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

}

在“活動”中實現界面。

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

}`

您的Pojo應該可解析或序列化,但是現在android建議實現可解析,然后您可以通過意圖傳遞任何Pojo,如何使您的類可解析檢查此鏈接。 https://developer.android.com/reference/android/os/Parcelable.html intent.putExtra(key,Serializable / Parcelable),然后在第二個活動中getParcelableExtra(key)/ getSerializableExtra(key)

我已經有一個Serializable對象:

公共類SendObject實現Serializable {

private List<Event> events;

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

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

}

主要問題是接收當前的適配器列表。 通過使用Singleton解決了該問題。 解決方案很簡單。

公共類RVAdapter擴展了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);
            }
        });
    }
}

無論如何,感謝您的回復!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM