【问题标题】:How to retrieve child values from firebase database and display them in a list of layouts?如何从 firebase 数据库中检索子值并将它们显示在布局列表中?
【发布时间】:2018-11-16 20:28:00
【问题描述】:

我有一个 Fragment 类,我想在其中显示一个布局列表,其中布局使用 firebase 数据值进行更新。

这是我的数据库的外观(user_dubs > user_id > photo id):

这是片段(已更新):

public class DubsFragment extends Fragment {

private static final String TAG = "DubsFragment";

//firebase
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;

//widgets
private EditText mthisdub;
private ListView mListView;

//vars
private ArrayList<String> mDubs;
private ArrayAdapter<String> adapter;
private Context mContext;
private PostDubs mpostdubs;
private String userID;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_mydubs, container, false);

    mListView = (ListView) view.findViewById(R.id.listViewz);
    mDubs = new ArrayList<>();
    mContext = getActivity();
    mpostdubs = new PostDubs();

    adapter = new ArrayAdapter<String>(mContext, R.layout.layout_dubs_listitem, R.id.getusername, mDubs);
    mListView.setAdapter(adapter);

        setupFirebaseAuth();
    return view;
}

private void setupFirebaseAuth(){
    Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");

    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = mFirebaseDatabase.getReference();

    userID = mAuth.getCurrentUser().getUid();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference
            .child(getString(R.string.dbname_userdubs))
            .child(userID)
            .orderByChild(getString(R.string.field_photoid));
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

                    for ( DataSnapshot singleSnapshot :  dataSnapshot.getChildren()) {
                        mpostdubs = singleSnapshot.getValue(PostDubs.class);
                        mDubs.add(mpostdubs.getEditdub().toString());
                        adapter.notifyDataSetChanged();
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
}


@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

}

配音类:

public class PostDubs {

    private String editdub;
    private String dubdate;
    private String user_id;
   private String photoid;
    private String username;
    private Context mContext;

    public PostDubs(String user_id, String editdub, String photoid, String dubdate, String username){
        this.user_id = user_id;
        this.editdub = editdub;
        this.dubdate = dubdate;
        this.photoid = photoid;
        this.username = username;
    }

    public PostDubs() {

    }


    public String getUser_id() {
        return user_id;
    }

    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    public String getEditdub() {
        return editdub;
    }

    public void setEditdub(String editdub) {
        this.editdub = editdub;
    }

    public String getDubdate() {
        return dubdate;
    }

    public void setDubdate(String dubdate) {
        this.dubdate = dubdate;
    }

    public String getPhotoid() {
        return photoid;
    }

    public void setPhotoid(String photoid) {
        this.dubdate = photoid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }


    @Override
    public String toString() {
        return "User{" +
                "user_id='" + editdub + '\'' +
                ", phone_number='" + dubdate + '\'' +
                '}';
    }

}

这是 layout_dubs_listitem.xml:

<?xml version="1.0" encoding="utf-8" ?>
     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto">
     <RelativeLayout android:layout_width="match_parent"
         android:layout_height="100dp">

    <de.hdodenhof.circleimageview.CircleImageView android:layout_width="75dp"
        android:layout_height="75dp"
        app:civ_border_color="@color/black"
         app:civ_border_width="0.5dp"
        android:id="@+id/profile_image"
        android:layout_marginLeft="20dp"
        android:layout_centerVertical="true" />

     <RelativeLayout android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_toRightOf="@+id/profile_image"
         android:layout_centerVertical="true">

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:textSize="22sp"
        android:textColor="@color/black"
        android:id="@+id/editdub"
        android:text=""/>

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:textSize="15sp"
        android:layout_centerVertical="true"
        android:textColor="@color/black"
         android:id="@+id/getusername"
        android:text=""/>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>

为了测试,我只是想在布局中获取编辑配音,但它根本不起作用。我确定我在做一些愚蠢的事情。

请指导我解决这个问题,如果你能帮助我用其他子值(如用户名)更新布局,那将非常有帮助。谢谢。

【问题讨论】:

  • 您的ArrayAdapter 尚未获得数据集。也就是说,您不会在任何地方将mDubs 传递给adapter,因此它没有什么可显示的。您可以在构造函数调用中将其作为第四个参数传递——即new ArrayAdapter&lt;String&gt;(..., ..., ..., mDubs)——然后在将项目添加到列表后调用adapter.notifyDataSetChanged()——即在onChildAdded() 中的循环之后。如果您选择该选项,则将 mListView.setAdapter(adapter) 调用移到 ArrayAdapter 构造函数调用之后,因为 Adapter 本身永远不需要创建新实例。
  • @MikeM。仍然无法正常工作.. idk 为什么
  • 您是否在onChildAdded() 中看到了来自Log.d() 的任何日志?也就是说,该方法是否真的在运行?
  • 不,我的意思是在onDataChange() 里面。您之前在onChildAdded() 中有Log.d(TAG, "onChildAdded: child added.");。您是否将Log 留在onDataChange() 中?
  • 是的,我做到了。我通过正确查询火力库解决了这个问题。谢谢顺便说一句!!

标签: android listview arraylist firebase-realtime-database


【解决方案1】:

我通过正确地命令我的孩子进入火力基地来修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多