简体   繁体   中英

Implementation onClick in FirestoreRecyclerAdapter to open a new Activity

In my app I have a recyclerView with elements from a Firestore database. 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. I've tried several solutions but none seem to work and I'm stuck. Please help me.

Adapter 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

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

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.

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

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