简体   繁体   English

在FirestoreRecyclerAdapter中实现onClick打开一个新的Activity

[英]Implementation onClick in FirestoreRecyclerAdapter to open a new Activity

In my app I have a recyclerView with elements from a Firestore database.在我的应用程序中,我有一个带有 Firestore 数据库元素的 recyclerView。 I want by clicking on an element in the recyclerView (which is inside a fragment) to pass the data of the element to another activity.我想通过单击 recyclerView 中的元素(位于片段内)将元素的数据传递给另一个活动。 I've tried several solutions but none seem to work and I'm stuck.我尝试了几种解决方案,但似乎都没有奏效,我被困住了。 Please help me.请帮我。

Adapter Class适配器 Class

public class InfoElementAdapter extends FirestoreRecyclerAdapter<InfoElement, InfoElementAdapter.InfoElementHolder> {

String urlImg;
public InfoElementAdapter(@NonNull FirestoreRecyclerOptions<InfoElement> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull InfoElementHolder holder, int position, @NonNull InfoElement model) {
    holder.textViewNomeRest.setText(model.getNome());
    holder.textViewDescrRest.setText(model.getDescrizione());
    urlImg = model.getUrlImg();
    Glide.with(holder.itemView.getContext()).load(urlImg).into(holder.imageView);
}

@NonNull
@Override
public InfoElementHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_single, parent, false );
    return new InfoElementHolder(v) ;
}

class InfoElementHolder extends RecyclerView.ViewHolder {

    TextView textViewNomeRest;
    TextView textViewDescrRest;
    ImageView imageView;
    public InfoElementHolder(@NonNull View itemView) {
        super(itemView);
        textViewNomeRest = itemView.findViewById(R.id.txt_v_nome);
        textViewDescrRest = itemView.findViewById(R.id.txt_v_descrizione);
        imageView = itemView.findViewById(R.id.imageV);
    }
}

} }

Fragment with the recyclerView带有 recyclerView 的片段

public class RestaurantFragment extends Fragment {

private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference restaurantRef = db.collection("restaurant_db");

private InfoElementAdapter adapter;

private View view;




@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_restaurant, container, false);

    setUpRecyclerView();

    return view;
}

private void setUpRecyclerView() {
    Query query = restaurantRef.orderBy("nome", Query.Direction.ASCENDING);

    FirestoreRecyclerOptions<InfoElement> options = new FirestoreRecyclerOptions.Builder<InfoElement>()
            .setQuery(query, InfoElement.class)
            .build();

    adapter = new InfoElementAdapter(options);



    RecyclerView recyclerView = view.findViewById(R.id.firestore_list1);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(Tools.getGridSpanCount(getActivity()), StaggeredGridLayoutManager.VERTICAL));
    recyclerView.addItemDecoration(new Tools.SpacingItemDecoration(Tools.getGridSpanCount(getActivity()), Tools.dpToPx(getActivity(), 4),true));
    recyclerView.setAdapter(adapter);
}

@Override
public void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    if (adapter != null) {
        adapter.stopListening();
    }
}

} }

InfoElement Class InfoElement Class

public class InfoElement {

private String nome;
private String descrizione;
private String urlImg;

public InfoElement() {
}

public InfoElement(String nome, String descrizione, String urlImg) {
    this.nome = nome;
    this.descrizione = descrizione;
    this.urlImg =  urlImg;
}

public void setNome(String nome) {
    this.nome = nome;
}

public void setDescrizione(String descrizione) {
    this.descrizione = descrizione;
}

public String getUrlImg() {
    return urlImg;
}

public void setUrlImg(String urlImg) {
    this.urlImg = urlImg;
}

public String getNome() {
    return nome;
}

public String getDescrizione() {
    return descrizione;
}

} }

You can change onBindViewHolder by setting up a click listener for the ViewHolder itemView , and add your data object with putExtra , and retrieve it with getIntent().getSerializableExtra at the target activity.您可以通过为onBindViewHolder设置单击侦听器来更改itemView ,并使用 putExtra 添加您的数据putExtra ,并在目标活动中使用getIntent().getSerializableExtra检索它。

@Override
protected void onBindViewHolder(@NonNull InfoElementHolder holder, int position, @NonNull InfoElement model) {
    holder.textViewNomeRest.setText(model.getNome());
    holder.textViewDescrRest.setText(model.getDescrizione());
    urlImg = model.getUrlImg();
    Glide.with(holder.itemView.getContext()).load(urlImg).into(holder.imageView);

    holder.itemView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent (v.getContext(), ActivityB.class);
            intent.putExtra("MyData", myData);
            startActivity(intent);
        }
    });
}

To retrieve the data at the target Activity在目标活动中检索数据

getIntent().getSerializableExtra("MyData");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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