【发布时间】: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<String>(..., ..., ..., 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