android - 片段中的 NoSuchMethodError 与 Cardview 和 RecyclerView 连接到 Firebase
问题描述
我正在尝试创建一个连接到 firebase 的事件报告应用程序,每当我在应用程序中创建事件时,它都会显示在 Firebase 数据库以及应用程序本身的 Cardview 和 RecyclerView 的形式中。我的应用程序已经可以在 Firebase 中显示输出,现在我正在尝试完成 CardView 和 RecyclerView。
但是,当我现在运行我的应用程序时,每当我尝试单击允许我输入事件的片段时,应用程序就会崩溃并显示以下错误:
java.lang.NoSuchMethodError:Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 zzbox()Z;或其超类('com.google.firebase.FirebaseApp' 的声明出现在 /data/app/com.example.samuel.a4-CppiMKcbuMktQgH7RUO1XA==/split_lib_dependencies_apk.apk 中)
假定的错误是我的片段中的这一行:
mDatabase = FirebaseDatabase.getInstance().getReference().child("Incidents");
请记住,这是一个片段,而我观看的教程是在普通课堂上进行的。
这是我输入事件的片段
package com.example.samuel.a4;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.github.clans.fab.FloatingActionButton;
import com.github.clans.fab.FloatingActionMenu;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import org.w3c.dom.Text;
public class IncmanFragment extends Fragment {
private RecyclerView mBlogList;
private DatabaseReference mDatabase;
FloatingActionButton fab;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
// return inflater.inflate(R.layout.fragment_incman, container,
false);
//i moved this up from just ontop of fab to here
View myView = inflater.inflate(R.layout.fragment_incman, container,
false);
// getFragmentManager().findFragmentById(R.id.fragment_container);
mDatabase =
FirebaseDatabase.getInstance().getReference().child("Incidents");
mDatabase.keepSynced(true);
mBlogList=(RecyclerView) myView.findViewById(R.id.recyclerview);
mBlogList.setHasFixedSize(true);
mBlogList.setLayoutManager(new LinearLayoutManager(getActivity()));
fab = (FloatingActionButton) myView.findViewById(R.id.fabIncident);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction fragmentTransaction =
getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, new
ReportFragment());
fragmentTransaction.addToBackStack(null);
/* Toast.makeText(getActivity(), "toast successful",
Toast.LENGTH_SHORT).show();*/
fragmentTransaction.commit();
}
});
return myView;
}
@Override
public void onStart() {
super.onStart();
FirebaseRecyclerAdapter<IncmanFirebaseName, IncmanViewHolder>
firebaseRecyclerAdapter = new
FirebaseRecyclerAdapter<IncmanFirebaseName,
IncmanViewHolder>
(IncmanFirebaseName.class, R.layout.incidentdesign,
IncmanViewHolder.class, mDatabase) {
@Override
protected void populateViewHolder(IncmanViewHolder viewHolder,
viewHolder.setTitle(model.getTitle());
viewHolder.setDetails(model.getDetailsId());
viewHolder.setRemarks(model.getRemarksId());
viewHolder.setLocation(model.getLocationId());
viewHolder.setDate(model.getDate());
viewHolder.setUrgency(model.getUrgencyId());
}
};
mBlogList.setAdapter(firebaseRecyclerAdapter);
}
public static class IncmanViewHolder extends RecyclerView.ViewHolder
{
View mView;
public IncmanViewHolder(View itemView)
{
super(itemView);
mView = itemView;
}
public void setTitle(String title)
{
TextView tvtitledesign =
(TextView)mView.findViewById(R.id.tvtitledesign);
tvtitledesign.setText(title);
}
public void setDetails(String detailsId)
{
TextView tvdetailsdesign =
(TextView)mView.findViewById(R.id.tvdetailsdesign);
tvdetailsdesign.setText(detailsId);
}
public void setRemarks(String remarksId)
{
TextView tvremarksdesign =
(TextView)mView.findViewById(R.id.tvremarksdesign);
tvremarksdesign.setText(remarksId);
}
public void setLocation(String locationId)
{
TextView tvlocationdesign = (TextView)
mView.findViewById(R.id.tvlocationdesign);
tvlocationdesign.setText(locationId);
}
public void setDate (String date)
{
TextView tvdatedesign =
(TextView)mView.findViewById(R.id.tvdatedesign);
tvdatedesign.setText(date);
}
public void setUrgency(String urgencyId)
{
TextView tvurgencydesign =
(TextView)mView.findViewById(R.id.tvurgencydesign);
tvurgencydesign.setText(urgencyId);
}
}
}
这是构造函数以及 get 和 set 方法所在的类
package com.example.samuel.a4;
public class IncmanFirebaseName {
private String date;
private String detailsId;
private String locationId;
private String remarksId;
private String reportedById;
private String splocationId;
private String typeId;
private String urgencyId;
private String title;
public IncmanFirebaseName(String date, String detailsId, String
remarksId/*String reportedById*/ /* String typeId*/, String urgencyId,
String
title) {
this.date = date;
this.detailsId = detailsId;
/* this.locationId = locationId;*/
this.remarksId = remarksId;
/*this.reportedById = reportedById;*/
this.splocationId = splocationId;
/*this.typeId = typeId;*/
this.urgencyId = urgencyId;
this.title=title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getDetailsId() {
return detailsId;
}
public void setDetailsId(String detailsId) {
this.detailsId = detailsId;
}
public String getLocationId() {
return locationId;
}
public void setLocationId(String locationId) {
this.locationId = locationId;
}
public String getRemarksId() {
return remarksId;
}
public void setRemarksId(String remarksId) {
this.remarksId = remarksId;
}
/*public String getReportedById() {
return reportedById;
}
public void setReportedById(String reportedById) {
this.reportedById = reportedById;
}*/
/* public String getSplocationId() {
return splocationId;
}
public void setSplocationId(String splocationId) {
this.splocationId = splocationId;
}*/
/* public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}*/
public String getUrgencyId() {
return urgencyId;
}
public void setUrgencyId(String urgencyId) {
this.urgencyId = urgencyId;
}
public String getTitle(){
return title;
}
public void setTitle() {
this.title = title;
}
public IncmanFirebaseName()
{
}
}
现在我不确定为什么 logcat 在我的代码中将该行显示为错误,因为我在另一个片段中有类似的行并且它工作得很好;这是片段:“ package com.example.samuel.a4;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.Image;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import org.w3c.dom.Text;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
import static android.app.Activity.RESULT_OK;
public class ReportFragment extends Fragment implements
AdapterView.OnItemSelectedListener{
private Button btnChoose,btnUpload;
private ImageView imageView;
private Uri filePath;
private final int PICK_IMAGE_REQUEST = 71;
private TextView mDisplayDate;
private DatePickerDialog.OnDateSetListener mDateSetListener;
private EditText reportedBy;
private TextView date; //upstairs declare alr as mDisplayDate
private Spinner spinner; //downstairs declare alr as spinner3
private EditText location;
private Spinner spinner2; //downstairs declare alr as spinner2
private EditText details;
private Spinner spinner3; //downstairs declare alr as spinner1
private EditText remarks;
private EditText title;
private Button submitIncident;
DatabaseReference databaseIncidents;
FirebaseStorage storage;
StorageReference storageReference;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_report, container,
false);
databaseIncidents =
FirebaseDatabase.getInstance().getReference("Incidents");
storage = FirebaseStorage.getInstance();
storageReference = storage.getReference();
btnChoose = (Button) v.findViewById(R.id.btnChoose);
btnUpload = (Button) v.findViewById(R.id.btnUpload);
imageView = (ImageView) v.findViewById(R.id.imgView);
reportedBy = (EditText) v.findViewById(R.id.etreportedby);
// Below have already line 151
// date = (TextView) v.findViewById(R.id.tvdate);
location = (EditText) v.findViewById(R.id.etlocation);
details = (EditText) v.findViewById(R.id.etdetails);
remarks = (EditText) v.findViewById(R.id.etremarks);
title = (EditText) v.findViewById(R.id.ettitle);
submitIncident = (Button) v.findViewById(R.id.btnSubmit);
btnChoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chooseImage();
}
});
btnUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadImage();
}
});
submitIncident.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
incidentSubmit();
}
});
return v;
}
private void incidentSubmit(){
String reportedname = reportedBy.getText().toString().trim();
String location1 = location.getText().toString();
String details1 = details.getText().toString();
String remarks1 = remarks.getText().toString();
String urgency1 = spinner.getSelectedItem().toString();
String type1 = spinner2.getSelectedItem().toString();
String splocation1 = spinner3.getSelectedItem().toString();
String date1 = mDisplayDate.getText().toString();
String title1 = title.getText().toString();
if(!TextUtils.isEmpty(reportedname)) {
String incidentId = databaseIncidents.push().getKey();
Incident incident = new
Incident(reportedname,location1,details1,remarks1,urgency1,type1,splocation1,date1,title1);
databaseIncidents.child(incidentId).setValue(incident);
Toast.makeText(getActivity(), "Incident Added",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), "All fields must be
entered",Toast.LENGTH_LONG).show();
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
String text = parent.getItemAtPosition(position).toString();
Toast.makeText(parent.getContext(), text, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
真诚感谢任何帮助。谢谢!
解决方案
好的,所以从您的评论和查看您的代码来看,我认为您在设置对数据库的引用和实际检索值之间感到困惑。
下面的代码行只是Incidents
在 Firebase 数据库中设置对子项的引用。
mDatabase = FirebaseDatabase.getInstance().getReference().child("Incidents");
要从数据库中检索值,您必须使用eventListeners
Read more about eventListeners
in this answer。
我给你一个示例代码来检索locationId
你的数据库节点的值,以获得第一个唯一 ID。它看起来像这样:
mDatabase.child("LR9j...").addListenerForSingleValueEvent(new ValueEventListener() {
// in the child("LR9j..") you have to put the whole first id from your image
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String locId = dataSnapshot.child("locationId").getValue(String.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled", databaseError.toException());
}
});
上面的代码将locationId
在变量中存储第一个唯一 ID 的值locId
。此外,您必须了解 Firebase 异步检索值,因此它只能在eventListener
.
在此答案中阅读有关 Firebase 异步行为的更多信息。
另请阅读文档中有关 Firebase 的更多信息。
推荐阅读
- python - Matplotlib:3D trisurf图中的ax.format_coord() - 返回(x,y,z)而不是(方位角,仰角)?
- html - 将注册表单数据卷曲到 MailChimp
- java - IntelliJ:构建 > 重建项目菜单项与 Maven 全新安装
- php - Symfony2 控制台,按位选项,使用可选的 --no 前缀?
- javascript - 检查 getElementsByTagName() 是否包含类属性 | 香草 JavaScript
- java - java 8 流中的一个简单 list.parallelStream() 似乎无法窃取?
- node.js - Google 代码实验室的 Ubuntu 配置错误
- typescript - 使用 AngularFire 和 Firestore 使用 Ng2 智能表显示嵌套对象
- python - 在循环中简化 keras 代码的最佳方法是什么?
- javascript - for循环未定义的'错误'