我正在开发一个 Android 应用程序。在我的应用程序中,有一个 GetSupportFragment.java。该片段包含回收器视图,其中包含卡片视图。在每个卡片视图中,都会显示 centerName、centerPhoneNumber 和 centerAddress。正在从 firebase 实时数据库中检索 centerName、centerPhoneNumber 和 centerAddress。问题是,似乎无法从数据库中检索数据。
获取SupportFragment.java
package com.example.wia2007.GetSupport;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.wia2007.GetSupport.GetSupportAdapter;
import com.example.wia2007.GetSupport.GetSupportCenterModel;
import com.example.wia2007.R;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
public class GetSupportFragment extends Fragment {
private static final String TAG = "GetSupportFragment";
RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_get_support, container, false);
//setupCenterModels();
DatabaseReference database = FirebaseDatabase.getInstance().getReference().child("Sheet1");
ArrayList<GetSupportCenterModel> centerModels = new ArrayList<>();
GetSupportAdapter adapter = new GetSupportAdapter(requireContext(), centerModels);
recyclerView = view.findViewById(R.id.rv_centers);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
database.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
centerModels.clear();
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
GetSupportCenterModel getSupportCenterModel = dataSnapshot.getValue(GetSupportCenterModel.class);
centerModels.add(getSupportCenterModel);
}
adapter.notifyDataSetChanged();
Log.d(TAG, "Data loaded successfully. Size: " + centerModels.size());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.e(TAG, "Error loading data: " + error.getMessage());
}
});
return view;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/*
private void setupCenterModels() {
String[] centerNames = getResources().getStringArray(R.array.center_names);
String[] centerPhoneNumbers = getResources().getStringArray(R.array.center_phone_numbers);
String[] centerAddresses = getResources().getStringArray(R.array.center_addresses);
for (int i = 0; i < centerNames.length; i++) {
centerModels.add(new GetSupportCenterModel(
centerNames[i],
centerPhoneNumbers[i],
centerAddresses[i]
));
}
}*/
}
获取SupportAdapter.java
package com.example.wia2007.GetSupport;
import static com.example.wia2007.GetSupport.GetSupportCenterModel.VIEW_TYPE_CARD_VIEW;
import static com.example.wia2007.GetSupport.GetSupportCenterModel.VIEW_TYPE_HEADER;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.wia2007.R;
import java.util.ArrayList;
public class GetSupportAdapter extends RecyclerView.Adapter {
Context context;
ArrayList<GetSupportCenterModel> getSupportCenterModels;
//constructor
public GetSupportAdapter(Context context, ArrayList<GetSupportCenterModel> getSupportCenterModels) {
this.context = context;
this.getSupportCenterModels = getSupportCenterModels;
}
@Override
public int getItemViewType(int position) {
return (position == 0) ? VIEW_TYPE_HEADER : VIEW_TYPE_CARD_VIEW;
}
class HeaderViewHolder extends RecyclerView.ViewHolder {
//grabbing the views from the recycler_view_row layout file
//serves like an onCreate method
public HeaderViewHolder(@NonNull View itemView) {
super(itemView);
}
}
class CardViewHolder extends RecyclerView.ViewHolder {
//grabbing the views from the recycler_view_row layout file
//serves like an onCreate method
TextView tvCenterName, tvCenterPhoneNumber, tvCenterAddress;
Button btnContactNow;
public CardViewHolder(@NonNull View itemView) {
super(itemView);
tvCenterName = itemView.findViewById(R.id.tv_center_name);
tvCenterPhoneNumber = itemView.findViewById(R.id.tv_center_phone_number);
tvCenterAddress = itemView.findViewById(R.id.tv_center_address);
btnContactNow = itemView.findViewById(R.id.btn_contact_now);
}
public void setViews(String centerName, String centerPhoneNumber, String centerAddress) {
tvCenterName.setText(centerName);
tvCenterPhoneNumber.setText(centerPhoneNumber);
tvCenterAddress.setText(centerAddress);
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//this is where you inflate the layout, giving a look to the rows
switch (viewType) {
case VIEW_TYPE_HEADER:
View headerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_header_get_support, parent, false);
return new HeaderViewHolder(headerView);
case VIEW_TYPE_CARD_VIEW:
View cardView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_cardview_get_support, parent, false);
return new CardViewHolder(cardView);
default:
return null;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
//assigning values to the views we created in the recycler_view_rows layout file
//based on position of the recycler view
int viewType = getItemViewType(position);
switch (viewType) {
case VIEW_TYPE_HEADER:
break;
case VIEW_TYPE_CARD_VIEW:
String centerName = getSupportCenterModels.get(position - 1).getCenterName();
String centerPhoneNumber = getSupportCenterModels.get(position - 1).getCenterPhoneNumber();
String centerAddress = getSupportCenterModels.get(position - 1).getCenterAddress();
((CardViewHolder) holder).setViews(centerName, centerPhoneNumber, centerAddress);
// Set up click listener for "Contact Now" button
((CardViewHolder) holder).btnContactNow.setOnClickListener(args -> {
Intent phone_intent = new Intent(Intent.ACTION_DIAL);
phone_intent.setData(Uri.parse("tel:" + centerPhoneNumber));
context.startActivity(phone_intent);
});
break;
default:
break;
}
}
@Override
public int getItemCount() {
//for recycler view to know the number of items to be displayed
return getSupportCenterModels.size() + 1;
}
}
获取SupportCenterModel.java
package com.example.wia2007.GetSupport;
public class GetSupportCenterModel {
public static final int VIEW_TYPE_HEADER = 0;
public static final int VIEW_TYPE_CARD_VIEW = 1;
int viewType;
String centerAddress;
String centerName;
String centerPhoneNumber;
public GetSupportCenterModel(String centerAddress, String centerName, String centerPhoneNumber) {
this.centerAddress = centerAddress;
this.centerName = centerName;
this.centerPhoneNumber = centerPhoneNumber;
}
public int getViewType() {
return viewType;
}
public String getCenterAddress() {
return centerAddress;
}
public String getCenterName() {
return centerName;
}
public String getCenterPhoneNumber() {
return centerPhoneNumber;
}
}
我已检查 Firebase 不为空,并且我已成功从 Android Studio 连接到 Firebase。我尝试了很多方法,但还是不行。
乍一看,问题出在下面这行代码:
DatabaseReference database = FirebaseDatabase.getInstance().getReference().child("Sheet1");
因此,您正在创建一个引用,该引用指向位于根节点正下方的名为
Sheet1
的节点。但是,该节点并不存在于此处,而是存在于您的结构深处的一层。在根引用和 Sheet1
节点之间,存在另一个节点,该节点很可能是用户的 UID (1X6GN...
)。
因此,要解决此问题,您必须添加另一个对
.child()
方法的调用,如下所示:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference database = FirebaseDatabase.getInstance().getReference().child(uid).child("Sheet1");
现在,当您循环结果时,您将能够获取节点并将它们转换为
GetSupportCenterModel
类型的对象。