有人可以帮助我解决这个问题吗,我尝试在Listview中显示firebase中的作业,但它没有显示任何内容!我已尝试在堆栈和不同站点的主题中使用不同的代码但在
处收到错误adapter=new ArrayAdapter<String>
(this,android.R.layout.simple_list_item_1,retrieve());
和这个
lv.setAdapter(adapter);
与nullexception
Javacode
package com.gumption.zeeshanahmed.jobaps;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.firebase.client.ChildEventListener;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import java.util.ArrayList;
public class EditsJobs extends AppCompatActivity {
ListView lv;
ArrayAdapter<String> adapter;
ArrayList<String> spacecrafts=new ArrayList<>();
// Declaring String variable ( In which we are storing firebase server URL
//).
public static final String Firebase_Server_URL =
"https://jobaps70.firebaseio.com/";
// Declaring String variables to store name & phone number get from
//EditText.
String PriceHolder, JobDescriptionHolder;
FirebaseHelper helper;
// Declaring Firebase object.
Firebase firebase;
// Creating FirebaseAuth.
FirebaseAuth firebaseAuth ;
// Creating FirebaseAuth.
FirebaseUser firebaseUser;
// Creating Boolean variable that holds EditText is empty or not status.
Boolean EditTextStatus ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edits_jobs);
//Actionbar
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setIcon(R.drawable.logo);
getSupportActionBar().setBackgroundDrawable(new
ColorDrawable(getResources().getColor(R.color.Snow)));
// Adding MainActivity context into Firebase context.
Firebase.setAndroidContext(EditsJobs.this);
// Passing firebase Server URL into firebase object.
firebase = new Firebase(Firebase_Server_URL);
firebaseAuth = FirebaseAuth.getInstance();
// On activity start check whether there is user previously logged in or
// not.
if(firebaseAuth.getCurrentUser() == null){
// Finishing current Profile activity.
finish();
// If user already not log in then Redirect to LoginActivity .
Intent intent = new Intent(EditsJobs.this, LoginActivity.class);
startActivity(intent);
// Showing toast message.
Toast.makeText(EditsJobs.this, "Please Log in to continue",
Toast.LENGTH_LONG).show();
}
// Adding firebaseAuth current user info into firebaseUser object.
firebaseUser = firebaseAuth.getCurrentUser();
// Getting logged in user email from firebaseUser.getEmail() method and
set into TextView.
setTitle( firebaseUser.getEmail());
setTitleColor(R.color.DarkGray);
// ListView element
lv = (ListView) findViewById(R.id.datadisplist);
adapter=new ArrayAdapter<String>
(this,android.R.layout.simple_list_item_1,retrieve());
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int
position, long id) {
Toast.makeText(EditsJobs.this, retrieve().get(position),
Toast.LENGTH_SHORT).show();
}
});
}
private void fetchData(DataSnapshot dataSnapshot)
{
jobsdetails.clear();
for (DataSnapshot ds : dataSnapshot.getChildren())
{
String jobs=ds.getValue(JobDetails.class).getjob();
jobsdetails.add(jobs);
}
}
//RETRIEVE
public ArrayList<String> retrieve(){
firebase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
return spacecrafts;
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="com.gumption.zeeshanahmed.jobaps.EditsJobs">
<TextView
android:id="@+id/texteditjobs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text_edit_jobs"
android:textSize="40sp"
android:textAlignment="center"/>
<ListView
android:id="@+id/datadisplist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_below="@+id/texteditjobs"
android:background="@color/Khaki"/>
</RelativeLayout>
的JobDetail
public class JobDetails {
private String price;
private String jobDescription;
private String jobSpinner;
public String email;
public JobDetails() {
// This is default constructor.
}
public String getPrice() {
return price;
}
public void setPrice(String pri) {
this.price = pri;
}
public String getjobDescription() {
return jobDescription;
}
public void setjobDescription(String jobd) {
this.jobDescription = jobd;
}
public void setjob(String jry) {
this.jobSpinner = jry ;
}
public String getjob() {
return jobSpinner;
}
public void setemail(String jel) {
this.email = jel ;
}
public String getemail() {
return email;
}
}
使用textView
当我使用文本视图时,数据只显示一个!
// Adding click listener to Show data button.
ShowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Adding addValueEventListener method on firebase object.
firebase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot MainSnapshot) {
for (DataSnapshot SubSnapshot : MainSnapshot.getChildren()) {
JobDetails jobdetails =SubSnapshot.getValue(JobDetails.class);
for
// Adding name and phone number of student into
string that is coming from server.
String ShowDataString = "Job: " +
jobdetails.getjob() + "\nJob Description: " +
jobdetails.getjobDescription() + "\n\n";
// Apply complete string variable into TextView.
ShowDataTextView.setText(ShowDataString);
}
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("Data Access Failed" +
firebaseError.getMessage());
}
});
}
});
使用Xml
<TextView
android:id="@+id/showmetadata"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/show"
android:textSize="40sp"
android:textAlignment="center"/>
如果有人帮我解决这个问题,将会非常有帮助。拜托,谢谢 你!
**尝试过listview **
现在我尝试了listview,这里崩溃是代码和错误
public class WorkActivity extends AppCompatActivity {
// Spinner jobSpin;
ListView lv;
Button ShowButton;
// Define a String ArrayList for the job
private ArrayList<String> jobdes=new ArrayList<>();
// Define an ArrayAdapter for the list
private ArrayAdapter<String> arrayAdapter;
// Declaring String variable ( In which we are storing firebase server URL
).
public static final String Firebase_Server_URL =
"https://jobaps70.firebaseio.com/";
public static final String Firebase_Server_URL1 =
"https://jobaps70.firebaseio.com/jobs";
// Declaring String variables to store name & phone number get from
EditText.
String PriceHolder, JobDescriptionHolder;
FirebaseHelper helper;
// Declaring Firebase object.
Firebase firebase,firebase1;
// Creating FirebaseAuth.
FirebaseAuth firebaseAuth ;
// Creating FirebaseAuth.
FirebaseUser firebaseUser;
// Creating Boolean variable that holds EditText is empty or not status.
Boolean EditTextStatus ;
TextView ShowDataTextView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edits_jobs);
// Actionbar
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setIcon(R.drawable.logo);
getSupportActionBar().setBackgroundDrawable(new
ColorDrawable(getResources().getColor(R.color.Snow)));
ShowButton = (Button)findViewById(R.id.show);
// Adding MainActivity context into Firebase context.
Firebase.setAndroidContext(WorkActivity.this);
// Passing firebase Server URL into firebase object.
firebase = new Firebase(Firebase_Server_URL);
firebase1=new Firebase(Firebase_Server_URL1);
firebaseAuth = FirebaseAuth.getInstance();
// On activity start check whether there is user previously logged in or
not.
if(firebaseAuth.getCurrentUser() == null){
// Finishing current Profile activity.
finish();
// If user already not log in then Redirect to LoginActivity .
Intent intent = new Intent(WorkActivity.this, LoginActivity.class);
startActivity(intent);
// Showing toast message.
Toast.makeText(WorkActivity.this, "Please Log in to continue",
Toast.LENGTH_LONG).show();
}
// Adding firebaseAuth current user info into firebaseUser object.
firebaseUser = firebaseAuth.getCurrentUser();
// Getting logged in user email from firebaseUser.getEmail() method and
set into TextView.
setTitle( firebaseUser.getEmail());
setTitleColor(R.color.DarkGray);
firebase.child("jobs");
// Associate the jobs' list with the corresponding ListView
lv = (ListView) findViewById(R.id.lvshow);
// Set the ArrayAdapter to the ListView
arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, jobdes);
lv.setAdapter(arrayAdapter);
// Attach a ChildEventListener to the teacher database, so we can
retrieve the job entries
firebase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
// Get the value from the DataSnapshot and add it to the jobs'
list
JobDetails jo = (JobDetails)
dataSnapshot.getValue(JobDetails.class);
String joString = String.valueOf(jo);
arrayAdapter.add(joString);
//
// Notify the ArrayAdapter that there was a change
arrayAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError databaseError) {
}
});
}
}
错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gumption.zeeshanahmed.jobaps, PID: 4774
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.gumption.zeeshanahmed.jobaps/
com.gumption.zeeshanahmed.jobaps.WorkActivity}:
java.lang.NullPointerException: Attempt to invoke virtual
method 'void
android.widget.ListView.setAdapter(android.widget.ListAdapter)'
on a null object reference at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)at
android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main
(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method
'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a
null object reference at
com.gumption.zeeshanahmed.jobaps.WorkActivity.onCreate
(WorkActivity.java:109)
at android.app.Activity.performCreate(Activity.java:6237) at
android.app.Instrumentation.callActivityOnCreate
(Instrumentation.java:1107) at
android.app.ActivityThread.performLaunchActivity
(ActivityThread.java:2369)atandroid.app.ActivityThread.handleLaunchActivity
(ActivityThread.java:2476) at android.app.ActivityThread.-
wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage
(ActivityThread.java:1344) at android.os.Handler.dispatchMessage
(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at
android.app.ActivityThread.main(ActivityThread.java:5417) at
java.lang.reflect.Method.invoke(Native Method) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main
(ZygoteInit.java:616)
java错误行
此处显示错误
lv.setAdapter(arrayAdapter);
答案 0 :(得分:1)
代码中的问题是retrieve()
,这是一种返回名为ArrayList<String>
的{{1}}的方法。此spacecrafts
在代码的第一行初始化,但从未更新过。换句话说,您在适配器中使用ArrayList<String>
为空。
要解决此问题,每次从Firebase获取数据时,请将其添加到右侧spacecrafts
。节点还有一件事,由于这些方法的异步行为,你不能以你的方式返回ArrayList<String>
,因为它总是为空。您需要在该方法中声明并使用/更新该ArrayList。
答案 1 :(得分:0)
问题是,您过早填充数据。当你调用retrieve()方法时,它立即运行并返回一个空的Arrylist。 Firebase不会立即为您提供数据。它在获取数据时会有一些延迟。所以首先获取所有数据,然后填充适配器。
或使用
adapter.notifydatasetchanged();
获取数据后。