繁体   English   中英

Android Intent 不将数据传输到另一个活动? Firebase 数据

[英]Android Intent not transferring data to another activity? Firebase Data

我昨天问过这个问题,但从来没有运气,我想我会用更清晰的轮廓重新询问我正在尝试做什么..

首先,这是我的 Firebase 层次结构
在此处输入图片说明

我有一个RecyclerViewAdapter /查看发现UID,如果用户对他们的“帐户”中所列的狗那么它会显示狗的列表,在这种情况下, finnmoo ,这部分是我的第一个活动- ChooseDog 每只狗都是可点击的,点击后,它会将您带到第二个活动 - DogProfile - 我将在其中显示每只特定狗的详细信息。 我的问题是配置文件只是随机挑选一只狗(如果有多个)并显示这些详细信息,我似乎无法区分结果。

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

选择狗(第一个活动)

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

DogProfile (第二个活动)

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

逻辑猫

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)

这个答案基于您最近的几个问题,希望对您有所帮助。 今天我不会谈论 firebase 身份验证或存储数据部分,因为你已经做到了。 我知道一开始您想检索数据并希望在RecyclerView显示它,然后如果用户单击这些特定数据/项目,您希望通过DogProfile显示详细信息。 几乎你的代码都很好,在getDogData()方法中,你应该只用 ArrayList 添加dogName并填充 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类,在这个我发现了一些错误的转换,例如 Spinner 作为 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>

在此处输入图片说明 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM