You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firestore RecyclerView适配器中正确设置点击事件跳转至详情页

Firestore RecyclerView适配器点击跳转餐厅详情页的正确实现

需求:为Firestore RecyclerView的适配器设置点击监听器,点击餐厅卡片时跳转到RestaurantDetailActivity展示餐厅详情。

现有适配器代码:

public class RestaurantAdapter extends FirestoreRecyclerAdapter<Restaurant, RestaurantAdapter.ViewHolder> {

    private Activity activity;

    public RestaurantAdapter(@NonNull FirestoreRecyclerOptions<Restaurant> options, Activity activity) {
        super(options);
        this.activity = activity;
    }

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

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Restaurant model) {
        holder.name.setText(model.getName());
        holder.phone.setText(model.getPhone());
        holder.category.setText(model.getCategory());
        holder.address.setText(model.getAddress());
        // 计划在此处实现点击逻辑
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView name, phone, category, address, averageRating;

        public ViewHolder(View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.textViewName);
            phone = itemView.findViewById(R.id.textViewPhone);
            category = itemView.findViewById(R.id.textViewCategory);
            address = itemView.findViewById(R.id.textViewAddress);
            averageRating = itemView.findViewById(R.id.textViewAverageRating);

        }
    }
}

尝试过以下无效代码:

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

            Intent restaurantIntent = new Intent(RestaurantAdapter.this, RestaurantDetailActivity.class);
            startActivity(restaurantIntent);
        }
    });
}

问题分析

之前的代码有两个核心错误:

  1. Intent上下文参数错误:RestaurantAdapter.this不是Context类型,需使用适配器持有的activity实例或itemView.getContext()
  2. 适配器本身没有startActivity方法,必须通过activity实例调用该方法

另外,为让详情页获取对应餐厅数据,需通过Intent传递餐厅关键信息(文档ID或实体对象)。

修改后的完整实现代码

public class RestaurantAdapter extends FirestoreRecyclerAdapter<Restaurant, RestaurantAdapter.ViewHolder> {

    private Activity activity;

    public RestaurantAdapter(@NonNull FirestoreRecyclerOptions<Restaurant> options, Activity activity) {
        super(options);
        this.activity = activity;
    }

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

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Restaurant model) {
        holder.name.setText(model.getName());
        holder.phone.setText(model.getPhone());
        holder.category.setText(model.getCategory());
        holder.address.setText(model.getAddress());

        // 设置卡片点击监听器
        holder.itemView.setOnClickListener(v -> {
            // 获取当前餐厅的Firestore文档ID(用于详情页从Firestore拉取数据)
            String restaurantId = getSnapshots().getSnapshot(position).getId();
            
            // 创建跳转Intent,上下文使用activity实例
            Intent intent = new Intent(activity, RestaurantDetailActivity.class);
            // 传递餐厅ID到详情页
            intent.putExtra("RESTAURANT_ID", restaurantId);
            // 也可直接传递整个Restaurant对象(需确保类实现Serializable/Parcelable)
            // intent.putExtra("RESTAURANT_DATA", model);
            
            // 通过activity启动详情页
            activity.startActivity(intent);
        });
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView name, phone, category, address, averageRating;

        public ViewHolder(View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.textViewName);
            phone = itemView.findViewById(R.id.textViewPhone);
            category = itemView.findViewById(R.id.textViewCategory);
            address = itemView.findViewById(R.id.textViewAddress);
            averageRating = itemView.findViewById(R.id.textViewAverageRating);

        }
    }
}

补充说明

  1. 若选择传递整个Restaurant对象,需让类实现Serializable接口:
public class Restaurant implements Serializable {
    // 类成员与方法
}

或实现Parcelable接口(推荐,传输效率更高)。

  1. 在RestaurantDetailActivity中获取传递的数据:
// 获取餐厅ID
String restaurantId = getIntent().getStringExtra("RESTAURANT_ID");

// 或获取整个Restaurant对象
Restaurant restaurant = (Restaurant) getIntent().getSerializableExtra("RESTAURANT_DATA");

内容的提问来源于stack exchange,提问作者user24480020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:56:05