0

我想显示使用他的邮件存储在firebase中登录的用户的ListView中的数据。例如登录用户的邮件是[email protected],并且ListView显示块块中的所有项目表示存储在firebase中的用户或项目的完整详细信息。例如,有一本书,firebase包含它的书名,内容,描述,doi,作者姓名等。我想要的是,如果作者登录只有他的书会显示书名,说明,内容和doi(书籍参考只是一个例子)。我的问题是我的列表视图显示有关作业的所有项目,包括属于其他用户的项目,我希望用户只编辑他自己发布的作业。那么,我应该写什么firebase查询来实现这一点,这里是我的代码。如何在firebase中以列表视图显示数据(包含与用户电子邮件相同的电子邮件的区块)

火力

Firebase

Java类

public class WorkActivity extends AppCompatActivity { 

    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 serverURL). 
    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_work_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) { 

     } 
    }); 
} 

} 

的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; 

    } 
    @Override 
    public String toString() { 
    return this.jobSpinner + ": " + this.jobDescription+ ": " +price; 
} 

} 

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.WorkActivity"> 
<TextView 
    android:id="@+id/textdispjobs" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/text_display_jobs" 
    android:textSize="40sp" 
    android:textAlignment="center"/> 

<ListView 
    android:id="@+id/lvshow" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentStart="true" 
    android:layout_below="@+id/show" /> 


</RelativeLayout> 

来自其他用户目前它显示的项目也是如此。 如果有人能帮助我,这将是非常有益的。谢谢!

+0

我觉得你有很多错误,因为你不能只在不使用//前面注释的时候去另一行。此外,您的WorkActivity不可读 – matrix

+0

这些是评论而不是代码 –

回答

0

如果您在用户第一次创建帐户时设置了电子邮件,则只有在Firebase中使用getEmail()函数才会返回电子邮件。要设置自己的电子邮件,你必须这样做:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
user.updateEmail("[email protected]"); 

如果您想了解更多关于这一点,this is where I got this code from

然后,您可以使用getEmail功能。否则,如果你想从JobDetails类的电子邮件,获得的电子邮件在您的childEventListener:

JobDetails jo = (JobDetails) dataSnapshot.getValue(JobDetails.class); 
//This getEmail function is provided in the JobDetails class 
String email = jo.getEmail(); 

编辑:

既然你是想只得到当前用户已经显示作业/添加,您需要先获取用户的电子邮件。假设你设置用户的基于它们的UID的数据库信息,你可以做这样的事情来获得当前用户:

private User curr_user; 
private String mUserId; 

mUserId = FirebaseAuth.getInstance.getUid(); 
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 


//Replace this path to wherever you stored your users 
mDatabase.child("users").child(mUserId).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      curr_user = dataSnapshot.getValue(User.class); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

现在,你可以通过作业的孩子获得张贴的工作循环当前用户的电子邮件:

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

     if (jo.getEmail() == curr_user.getEmail()) { 
      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) { 

    } 
}); 
+0

String email = jo.getEmail();它只显示块中的电子邮件,我想显示整个块的内容 –

+0

那么在这种情况下,您可能想要创建一个自定义适配器,它在构造函数中接受'jo'对象,然后根据什么填充'TextView'你要。如果你想创建一个ListView更多的帮助,看看这个链接:https://stackoverflow.com/questions/8166497/custom-adapter-for-list-view –

+0

我想显示的东西显示从数据库我的问题是如何检索/显示当前用户存储的块。例如在堆栈中,您可以查看您在用户配置文件中的活动栏中编写的问题列表! –

相关问题