java - FirestoreRecyclerAdapter中实现onClick打开新的Activity

标签 java android android-fragments android-recyclerview google-cloud-firestore

在我的应用程序中,我有一个 recyclerView,其中包含 Firestore 数据库中的元素。我想通过单击 recyclerView 中的元素(位于 fragment 内)将该元素的数据传递给另一个 Activity 。我尝试了几种解决方案,但似乎都不起作用,我陷入了困境。请帮助我。

适配器类

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

}

使用 recyclerView 进行 fragment

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 类

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

}

最佳答案

您可以通过为 ViewHolder itemView 设置点击监听器来更改 onBindViewHolder,并使用 putExtra 添加数据对象并检索它在目标 Activity 处使用 getIntent().getSerializedExtra

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

检索目标 Activity 的数据

getIntent().getSerializableExtra("MyData");

关于java - FirestoreRecyclerAdapter中实现onClick打开新的Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62123519/

相关文章:

android - 从 BroadcastReceiver 更新 fragment 的 TextView

java - 仅在按住按钮时显示对话框 fragment

java - 数组转换 Java 8 与 Java 9

java - 如果值相等,PriorityQueue 排序不会维持字母顺序

java - 将属性文件与 Maven 程序集合并

java - Android Handler 刷新 GUI

java - 具有多个模块和多个程序集的 Maven 项目

android - 浏览器的 JavaScript 接口(interface)在 4.2.2 中不起作用

java - 断言错误 : Unexpected schema version 0: Unexpected schema version 0

android - getWidth 在 Fragment 中返回 0,getPaddingLeft 返回非零