【问题标题】:Android Intent not transferring data to another activity? Firebase DataAndroid Intent 不将数据传输到另一个活动? Firebase 数据
【发布时间】:2021-07-30 07:51:54
【问题描述】:

我昨天问过这个问题,但运气不好,我想我会重新问一个更清晰的轮廓来说明我正在尝试做什么..

首先,这是我的 Firebase 层次结构

我有一个 RecyclerViewAdapter/View 可以找到 Uid,如果用户在他们的“帐户”上列出了狗,那么它将显示狗列表,在这种情况下是 finnmoo,这部分是我的第一项活动 - ChooseDog。每只狗都是可点击的,点击后,它将带您进入第二个活动 - DogProfile - 我将在其中显示每只特定狗的详细信息。 我的问题是配置文件只是随机挑选一只狗(如果有不止一只)并显示这些细节,我似乎无法区分结果。

我想使用ChooseDog 的卡片/按钮上显示的名称,通过intent 将其发送到DogProfile,然后使用该名称显示所选狗的正确详细信息。我对此很陌生,但觉得我做的一切都有些正确?任何帮助表示赞赏。在明确声明名称时,我已经能够找到详细信息,但在尝试从卡中检索名称时却没有。

ChooseDog(第一次活动)

TextView dogName;

databaseReference = FirebaseDatabase.getInstance().getReference("user").child(uid).child("dogs");
dogName = findViewById(R.id.dogName);

    ItemClickSupport.addTo(recyclerView).setOnItemClickListener(
            new ItemClickSupport.OnItemClickListener() {
                @Override
                public void onItemClicked(RecyclerView recyclerView, int position, View v) {
                    getDogData();
                    Intent intent = new Intent(ChooseDog.this, DogProfile.class);
                    intent.putExtra("name", dogName.getText().toString());
                    startActivity(intent);
                }
            }
    );

 private void getDogData() {
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot ds : dataSnapshot.getChildren()) {

                    String dogName = ds.child("name").getValue(String.class);
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.w("TAG", "onCancelled", databaseError.toException());
            }
        });
    }

狗狗档案(第二次活动)

private void getDogData() {

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("user").child(uid).child("dogs");

    String dogsName = getIntent().getExtras().getString("name");
    Query query = databaseReference.orderByChild("name").equalTo(dogsName);

    query.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String name = ds.child("name").getValue(String.class);

             
                    String dogBreed = ds.child("breed").getValue(String.class);
                    String dogAge = ds.child("age").getValue(String.class);
                    String gender = ds.child("gender").getValue(String.class);
                    String dogWeight = ds.child("weight").getValue(String.class);
                    String neutered = ds.child("neutered").getValue(String.class);

                    dogName.setText(name);
                    breed.setText(dogBreed);
                    age.setText(dogAge);
                    dogGender.setText(gender);
                    weight.setText(dogWeight);
                    isNeutered.setText(neutered);
           
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w("TAG", "onCancelled", databaseError.toException());
        }
    });
}

Logcat

2021-07-29 10:13:49.990 17941-17941/com.example.doggo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.doggo, PID: 17941
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
        at com.example.doggo.ChooseDog$1.onItemClicked(ChooseDog.java:69)
        at com.example.doggo.ItemClickSupport$1.onClick(ItemClickSupport.java:16)
        at android.view.View.performClick(View.java:8160)
        at android.view.View.performClickInternal(View.java:8137)
        at android.view.View.access$3700(View.java:888)
        at android.view.View$PerformClick.run(View.java:30236)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8512)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139)

【问题讨论】:

  • 您是从文本字段中获取狗名,然后将其发送到下一个活动,还是从数据库中检索狗名并发送?
  • 我从数据库中获取狗的名字,将其显示在卡片文本视图(第一个活动)上,基本上我想检查我的第二个活动是否该文本视图与数据库中的名称匹配,显示特定狗的详细信息,希望这有意义@PeterHaddad
  • Frank van Puffelen 的 answer 到底有什么不好的地方?
  • 他的回答有效,但它是静态的,我需要动态拉取数据,所以equalTo("moo") 需要从按钮的textView 中找到名称。我不知道我是不是盯着它看太久了,或者我把东西放错了地方,但我经常收到NullPointerException,所以绝对不是从正确的地方拉东西。 @AlexMamo
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。还请说明您在哪一行特定代码处收到 NullPointerException?

标签: java android firebase firebase-realtime-database


【解决方案1】:

此答案基于您最近的几个问题,希望对您有所帮助。今天我不会谈论 firebase 身份验证或存储数据部分,因为您已经这样做了。我了解,起初您想检索数据并希望在 RecyclerView 中显示它,然后如果用户单击这些特定数据/项目,您希望通过 DogProfile 显示详细信息。几乎您的代码都很好,在 getDogData() 方法中,您应该只添加 dogName 和 ArrayList 并填充 Adapter 。然后通过 Intent 传递数据,使用adapter.getItem(position) 而不是dogName 变量。

只需按照这些代码-

  1. ChooseDog

           public class ChooseDog extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
    
     MyRecyclerViewAdapter adapter;
     private DatabaseReference databaseReference;
     private ArrayList<String> dogList;
     private String dogName;
     private RecyclerView recyclerView;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_choose_dog);
    
         // dogName = findViewById(R.id.dogName);
    
         databaseReference = FirebaseDatabase.getInstance().getReference("user").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("dogs");
         getDogData();
    
         dogList = new ArrayList<>();
         recyclerView = findViewById(R.id.dogList);
         recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
         adapter = new MyRecyclerViewAdapter(getApplicationContext(), dogList);
         adapter.setClickListener(this);
    
    
     }
    
    
     private void getDogData() {
         databaseReference.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
    
                 for (DataSnapshot ds : dataSnapshot.getChildren()) {
    
                     dogName = ds.child("name").getValue().toString();
                     dogList.add(dogName);
                     recyclerView.setAdapter(adapter);
    
    
                 }
    
             }
    
             @Override
             public void onCancelled(DatabaseError databaseError) {
                 Log.w("TAG", "onCancelled", databaseError.toException());
             }
         });
     }
    
     @Override
     public void onItemClick(View view, int position) {
         Toast.makeText(this, "You Selected " + adapter.getItem(position), Toast.LENGTH_SHORT).show();
         Intent intent = new Intent(ChooseDog.this, DogProfile.class);
         intent.putExtra("name", adapter.getItem(position));
         startActivity(intent);
     }
    }
    
  2. activity_choose_do.xml

          <?xml version="1.0" encoding="utf-8"?>
       <androidx.constraintlayout.widget.ConstraintLayout  xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".ChooseDog">
    
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/dogList"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
    
       </androidx.constraintlayout.widget.ConstraintLayout>
    
  3. MyRecyclerViewAdapter

     public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
    
     private List<String> zData;
     private LayoutInflater zInflater;
     private ItemClickListener mClickListener;
    
     // data is passed into the constructor
     MyRecyclerViewAdapter(Context context, List<String> data) {
         this.zInflater = LayoutInflater.from(context);
         this.zData = data;
     }
    
     // inflates the row layout from xml when needed
     @Override
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View view = zInflater.inflate(R.layout.recyclerview_layout, parent, false);
         return new ViewHolder(view);
     }
    
     // binds the data to the TextView in each row
     @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
         String dog = zData.get(position);
         holder.myTextView.setText(dog);
     }
    
     // total number of rows
     @Override
     public int getItemCount() {
         return zData.size();
     }
    
    
     // stores and recycles views as they are scrolled off screen
     public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
         TextView myTextView;
    
         ViewHolder(View itemView) {
             super(itemView);
             myTextView = itemView.findViewById(R.id.dogsName);
             itemView.setOnClickListener(this);
         }
    
         @Override
         public void onClick(View view) {
             if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
         }
     }
    
     // convenience method for getting data at click position
     String getItem(int id) {
         return zData.get(id);
     }
    
     // allows clicks events to be caught
     void setClickListener(ItemClickListener itemClickListener) {
         this.mClickListener = itemClickListener;
     }
    
     // parent activity will implement this method to respond to click events
     public interface ItemClickListener {
         void onItemClick(View view, int position);
     }
    }
    
  4. recyclerview_layout.xml

     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:padding="10dp">
    
     <TextView
         android:id="@+id/dogsName"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textSize="20sp"/>
    
  5. DogProfile class,在这个我发现了一些错误的演员阵容,比如 Spinner as TextView 。这里固定副本-

     public class DogProfile extends AppCompatActivity {
    
     private FirebaseAuth firebaseAuth;
     private FirebaseUser currentUser;
    
     TextView breed;
     Spinner ageDropdown, genderDropdown, weightDropdown, neuteredDropdown; //zi
     String uid;
     String dogId;
     private EditText dogName; //zi
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.dog_profile);
    
         firebaseAuth = FirebaseAuth.getInstance();
         currentUser = firebaseAuth.getCurrentUser();
         uid = currentUser.getUid();
    
         dogName = findViewById(R.id.name);
         breed = findViewById(R.id.breed);
         ageDropdown = findViewById(R.id.age);
         genderDropdown= findViewById(R.id.gender);
         weightDropdown = findViewById(R.id.weight);
         neuteredDropdown = findViewById(R.id.neutered);
    
         getDogData();
    
     }
    
     private void getDogData() {
    
         DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("user").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("dogs");
    
         String dogsName = getIntent().getExtras().getString("name");
         Query query = databaseReference.orderByChild("name").equalTo(dogsName);
    
         query.addValueEventListener(new ValueEventListener() {
    
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
    
                 for (DataSnapshot ds : dataSnapshot.getChildren()) {
                     String name = (String) ds.child("name").getValue();
    
                     if (name.equals(dogsName)) {
                         String dogBreed = (String) ds.child("breed").getValue();
                         String dogAge = (String) ds.child("age").getValue();
                         String gender = (String) ds.child("gender").getValue();
                         String dogWeight = (String) ds.child("weight").getValue();
                         String neutered = (String) ds.child("neutered").getValue();
    
                         dogName.setText(name);
                         breed.setText(dogBreed);
    
    
         ArrayAdapter<String> ageAdapter = new ArrayAdapter<String> (getApplicationContext(), android.R.layout.simple_spinner_item, Collections.singletonList(dogAge));
         ageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         ageDropdown.setAdapter(ageAdapter);
    
         ArrayAdapter<String> weightAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, Collections.singletonList(dogWeight));
         weightAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         weightDropdown.setAdapter(weightAdapter);
    
         ArrayAdapter<String> genderAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, Collections.singletonList(gender));
         genderAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         genderDropdown.setAdapter(genderAdapter);
    
         ArrayAdapter<String> neuteredAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, Collections.singletonList(neutered));
         neuteredAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         neuteredDropdown.setAdapter(neuteredAdapter);
                     } else {
                         Toast.makeText(DogProfile.this, "Please try again..", Toast.LENGTH_SHORT).show();
                     }
                 }
             }
    
             @Override
             public void onCancelled(DatabaseError databaseError) {
                 Log.w("TAG", "onCancelled", databaseError.toException());
             }
         });
     }
    
    
    }
    
  6. dog_profile.xml

     <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".DogProfile">
    
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/constraintLayout"
         android:layout_width="0dp"
         android:layout_height="560dp"
         android:layout_marginStart="9dp"
         android:layout_marginLeft="9dp"
         android:layout_marginEnd="9dp"
         android:layout_marginRight="9dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent">
    
         <Spinner
             android:id="@+id/age"
             android:layout_width="160dp"
             android:layout_height="59dp"
             android:autofillHints="age"
             android:hint="Age"
             android:inputType="text"
             android:labelFor="@+id/name"
             android:spinnerMode="dropdown"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.085"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.353" />
    
         <Spinner
             android:id="@+id/weight"
             android:layout_width="160dp"
             android:layout_height="61dp"
             android:autofillHints="weight"
             android:hint="Weight (kg)"
             android:inputType="text"
             android:labelFor="@+id/name"
             android:spinnerMode="dropdown"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.901"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.356" />
    
         <TextView
             android:id="@+id/breed"
             android:layout_width="347dp"
             android:layout_height="57dp"
             android:autofillHints="breed"
             android:focusable="true"
             android:hint="Breed"
             android:inputType="text"
             android:labelFor="@+id/name"
             android:spinnerMode="dropdown"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.434"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.196" />
    
         <EditText
             android:id="@+id/name"
             android:layout_width="354dp"
             android:layout_height="56dp"
             android:autofillHints="Name"
             android:hint="Name"
             android:inputType="text"
             android:labelFor="@+id/name"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.495"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.032" />
    
         <Spinner
             android:id="@+id/gender"
             android:layout_width="160dp"
             android:layout_height="61dp"
             android:autofillHints="gender"
             android:hint="Gender"
             android:inputType="text"
             android:labelFor="@+id/name"
             android:spinnerMode="dropdown"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.086"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.532" />
    
         <Spinner
             android:id="@+id/neutered"
             android:layout_width="160dp"
             android:layout_height="56dp"
             android:autofillHints="neutered"
             android:hint="Neutered?"
             android:inputType="text"
             android:labelFor="@+id/name"
             android:spinnerMode="dropdown"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.901"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.535" />
    
         <TextView
             android:id="@+id/textView"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Daily Exercise Goal"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.058"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.665" />
    
         <View
             android:id="@+id/divider"
             android:layout_width="match_parent"
             android:layout_height="1dp"
             android:background="?android:attr/listDivider"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.0"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintVertical_bias="0.624" />
    
     </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    

【讨论】:

  • 如果你觉得这个答案有用,你可以通过✓接受这个答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多