【问题标题】:Opening a new Activity from a RecyclerView with Firebase data从 RecyclerView 使用 Firebase 数据打开一个新 Activity
【发布时间】:2021-01-10 18:20:43
【问题描述】:

我正在创建一个 TripAdvisor 克隆应用程序,该应用程序从 Firebase 数据库中获取数据并显示其中的数据。我想向 RecyclerView 添加一个侦听器,该侦听器打开一个名为 locationInDetailActivity 的新 Activity,它显示有关所选元素的信息。以下是 MainActivity 和 RecyclerView 适配器的代码。

MainActivity.java

package com.example.progettocv19ingsw;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

public class MainActivity extends AppCompatActivity {

    private Button to_advanced_filters;
    private RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;
    private DatabaseReference reference;
    private RecyclerViewAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        to_advanced_filters = (Button) findViewById(R.id.advancedFilters);
        recyclerView = findViewById(R.id.locationRecyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        to_advanced_filters.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openAdvancedFilterActivity();
            }
        });

        reference = FirebaseDatabase.getInstance().getReference();
        FirebaseRecyclerOptions<locationClass> options = new FirebaseRecyclerOptions.Builder<locationClass>().setQuery(FirebaseDatabase.getInstance().getReference().child("locations"), locationClass.class).build();
        adapter = new RecyclerViewAdapter(options);
        recyclerView.setAdapter(adapter);
    }
    public void openAdvancedFilterActivity(){
        Intent open = new Intent(this, AdvancedFilters.class);
        startActivity(open);
    }

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

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

RecyclerViewAdapter.java

package com.example.progettocv19ingsw;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;

public class RecyclerViewAdapter extends FirebaseRecyclerAdapter<locationClass, RecyclerViewAdapter.myViewHolder> {

    private static final String TAG = "RecyclerView";

    public RecyclerViewAdapter(@NonNull FirebaseRecyclerOptions options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull myViewHolder viewHolder, int i, @NonNull locationClass location) {
        viewHolder.locationName.setText(location.getLocationName());
        viewHolder.locationType.setText(location.getLocationType());
        Glide.with(viewHolder.locationImage.getContext()).load(location.getLocationPic()).into(viewHolder.locationImage);
        viewHolder.reviewNumber.setText(String.valueOf(location.getReviewNumber()));
        viewHolder.averageRatingBar.setRating(location.getAverageRating());
        viewHolder.averageRatingBar.setStepSize(location.getAverageRating());
    }

    @Override
    public int getItemCount() {
        return super.getItemCount();
    }

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

    class myViewHolder  extends RecyclerView.ViewHolder {

        ImageView locationImage;
        TextView locationName;
        TextView locationType;
        RatingBar averageRatingBar;
        TextView reviewNumber;
        Context context;

        public myViewHolder(@NonNull View itemView) {
            super(itemView);
            locationImage = (ImageView) itemView.findViewById(R.id.locationPicture);
            locationName = (TextView) itemView.findViewById(R.id.locationName);
            locationType = (TextView) itemView.findViewById(R.id.locationType);
            reviewNumber = (TextView) itemView.findViewById(R.id.reviewNumber);
            averageRatingBar = (RatingBar) itemView.findViewById(R.id.averageRating);
        }
    }
}

locationInDetailActivity.java

package com.example.progettocv19ingsw;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class locationInDetailActivity extends AppCompatActivity {
    private static final String TAG = "locationDetailActivity";

    private Button toReviews;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.location_data);
        Log.d(TAG, "onCreate: Started");
        toReviews.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                openReviewActivity();
            }
        });
    }

    private void openReviewActivity() {
        Intent intent = new Intent(this, reviewActivity.class);
    }
}

我尝试添加一个 OnClick 侦听器,但它给我“无法解析方法”或 NullPointerException() 错误。我该怎么办?

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    Colin Degen 是对的,但你可以做一些更通用的事情。

    为点击事件创建一个接口:

    public interface IClickListener {
        void onItemClick(int position, View view);
        void onItemLongClick(int position, View view);
    }
    

    创建一个满足您需求的回收器视图适配器:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    
    private IClickListener clickListener;
    private List<String> models;
    
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener {
    
        public TextView textView;
    
        public ViewHolder(View itemView) {
            super(itemView);
    
            textView = itemView.findViewById(R.id.textView);
    
            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }
    
    
        @Override
        public void onClick(View view) {
            clickListener.onItemClick(getAdapterPosition(), view);
        }
    
        @Override
        public boolean onLongClick(View view) {
            clickListener.onItemLongClick(getAdapterPosition(), view);
            return false;
        }
    }
    
    
    public RecyclerViewAdapter(List<String> models) {
        this.models = models;
    }
    
    
    public void setOnItemClickListener(IClickListener clickListener) {
        this.clickListener = clickListener;
    }
    
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
    
        View view = inflater.inflate(R.layout.list_item, parent, false);
    
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final String model = models.get(position);
    
        TextView textView = holder.textView;
        textView.setText(model);
    }
    
    @Override
    public int getItemCount() {
        return models.size();
    }}
    

    然后,当您想使用回收站视图时,您可以执行以下操作:

    ArrayList<String> dataSource = new ArrayList<String>()
    // Add some data to the dataSource
    
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(dataSource);
    adapter.setOnItemClickListener(new IClickListener() {
            @Override
            public void onItemClick(int position, View view) {
                String model = dataSource.get(position);
                // Do stuff with your model like passing data to the next activity
            }
    
    });
    

    【讨论】:

      【解决方案2】:

      您必须为 RecyclerView 中的每个元素定义一个 OnClickListener。

          private final OnClickListener mOnClickListener = new MyOnClickListener(){
              @Override
              public void onClick(final View view) {
                 int itemPosition = mRecyclerView.getChildLayoutPosition(view);
                 YourItem item = mList.get(itemPosition);
                 //Do stuff and start your activity
              }
          }
      
          @NonNull
          @Override
          public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.location_recyclerrow, parent, false);
              view.setOnClickListener(mOnClickListener);
              return new myViewHolder(v);
          }
      

      然后将 RecyclerView 实例传递给适配器的构造函数

          private RecyclerView mRecyclerView;
      
          public RecyclerViewAdapter(@NonNull FirebaseRecyclerOptions options, RecyclerView rV) {
              super(options);
              mRecyclerView = rV;
          }
      

      【讨论】:

      • 我不明白private final OnClickListener mOnClickListener = new MyOnClickListener();。这是哪里来的?
      • 只需在你的 RecyclerViewAdapter 中为这个变量定义一个公共设置器,然后在包含你的适配器的类中设置它
      • 我正在尝试这样做,但 Android Studio 告诉我“没有找到没有设置器的字段。”
      • 等我编辑我的答案并展示完整的实现
      • 我编辑了我的答案。新实现不需要设置器
      猜你喜欢
      • 2020-02-19
      • 2022-08-07
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多