当其他用户使用我的应用程序时,我的列表视图会自动填充(Firebase,android)
My list view is automatically populating when other users are using my application(Firebase,android)
我正在使用自定义适配器从 firebase 实时数据库填充我的列表视图 dynamically.Getting 数据。我不希望应用程序在每个人都离线时使用我的 application.because 来填充它 listview 保持正常。
This is whats happening
This is how it should be
我已经尽我所能。我在 3/4 活动中使用 myadapter
My adapter.java
public class MyAdapter extends ArrayAdapter<String> {
ArrayList<String> name=new ArrayList<>();
ArrayList<String> status=new ArrayList<>();
ArrayList<String> imgs=new ArrayList<>();
ArrayList<String> key=new ArrayList<>();
private Context context;
private int resource;
private LayoutInflater layoutInflater;
public MyAdapter(@NonNull Context context, int resource, ArrayList<String> name, ArrayList<String> status, ArrayList<String> imgs,ArrayList<String> key) {
super(context, resource);
this.imgs=imgs;
this.name=name;
this.status=status;
this.key=key;
this.resource=resource;
this.context=context;
layoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return name.size();
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
// return super.getView(position, convertView, parent);
View v=layoutInflater.inflate(resource,parent,false);
CircleImageView view=v.findViewById(R.id.single_user_image);
if(imgs!=null) {
Picasso.get().load(imgs.get(position)).placeholder(R.drawable.user).into(view);
}else{
Picasso.get().load(R.drawable.user).into(view);
Toasty.error(context,"check internet connection", Toast.LENGTH_SHORT).show();
}
TextView tv1=v.findViewById(R.id.single_user_name);
TextView tv2=v.findViewById(R.id.single_user_status);
tv1.setText(name.get(position));
tv2.setText("Connected Since:"+status.get(position));
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(getContext(),SingleUserProfileActivity.class);
intent.putExtra("key",key.get(position));
getContext().startActivity(intent);
}
});
return v;
}
}
Myactivity.java
public class ConnectedUsersFragment extends Fragment {
ListView connectedUsersList;
DatabaseReference connectedUsersReference;
DatabaseReference userInfoRefernce;
DatabaseReference presenceReference;
ArrayList<String> name=new ArrayList<>();
ArrayList<String> status=new ArrayList<>();
ArrayList<String> imgs=new ArrayList<>();
ArrayList<String> key=new ArrayList<>();
MyAdapter adapter;
FirebaseUser user;
public ConnectedUsersFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_connected_users, container, false);
connectedUsersList=v.findViewById(R.id.connected_users_list);
user=FirebaseAuth.getInstance().getCurrentUser();
presenceReference=FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid());
connectedUsersReference= FirebaseDatabase.getInstance().getReference().child("connected_users").child(user.getUid());
userInfoRefernce=FirebaseDatabase.getInstance().getReference().child("users");
adapter=new MyAdapter(getContext(),R.layout.single_user_layout,name,status,imgs,key);
connectedUsersList.setAdapter(adapter);
connectedUsersReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String userKey=dataSnapshot.getKey();
final String userConnectedDate=dataSnapshot.child("date").getValue(String.class);
userInfoRefernce.child(userKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String userKey=dataSnapshot.getKey();
String username=dataSnapshot.child("name").getValue(String.class);
String userstatus=dataSnapshot.child("profile_status").getValue(String.class);
String userimg=dataSnapshot.child("thumb_image").getValue(String.class);
name.add(username);
status.add(userConnectedDate);
imgs.add(userimg);
key.add(userKey);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toasty.error(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toasty.warning(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
return v;
}
@Override
public void onStart() {
super.onStart();
if(user!=null) {
presenceReference.child("online").setValue("true");
}
}
@Override
public void onResume() {
super.onResume();
if(user!=null) {
presenceReference.child("online").setValue("true");
}
}
@Override
public void onStop() {
super.onStop();
if(user!=null) {
presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
}
}
@Override
public void onPause() {
super.onPause();
if(user!=null) {
presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
}
}
}
在 userInfoRefernce.child(userKey)
中,您设置了一个 ValueEventListener
,每次用户触发任何生命周期事件时都会触发该事件(请参阅 onStart、onResume、onPause 和 onStop)。尝试使用 ChildEventListener
并使用 Query 在下载数据之前过滤数据。
希望对您有所帮助。
我将 ValueEventListener() 替换为 ListenerForSingleValueEvent(),因为我想在这些页面上只显示一次监听事件,感谢@Victor Maldonado,我记得其中的区别:P
我正在使用自定义适配器从 firebase 实时数据库填充我的列表视图 dynamically.Getting 数据。我不希望应用程序在每个人都离线时使用我的 application.because 来填充它 listview 保持正常。 This is whats happening This is how it should be 我已经尽我所能。我在 3/4 活动中使用 myadapter
My adapter.java
public class MyAdapter extends ArrayAdapter<String> {
ArrayList<String> name=new ArrayList<>();
ArrayList<String> status=new ArrayList<>();
ArrayList<String> imgs=new ArrayList<>();
ArrayList<String> key=new ArrayList<>();
private Context context;
private int resource;
private LayoutInflater layoutInflater;
public MyAdapter(@NonNull Context context, int resource, ArrayList<String> name, ArrayList<String> status, ArrayList<String> imgs,ArrayList<String> key) {
super(context, resource);
this.imgs=imgs;
this.name=name;
this.status=status;
this.key=key;
this.resource=resource;
this.context=context;
layoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return name.size();
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
// return super.getView(position, convertView, parent);
View v=layoutInflater.inflate(resource,parent,false);
CircleImageView view=v.findViewById(R.id.single_user_image);
if(imgs!=null) {
Picasso.get().load(imgs.get(position)).placeholder(R.drawable.user).into(view);
}else{
Picasso.get().load(R.drawable.user).into(view);
Toasty.error(context,"check internet connection", Toast.LENGTH_SHORT).show();
}
TextView tv1=v.findViewById(R.id.single_user_name);
TextView tv2=v.findViewById(R.id.single_user_status);
tv1.setText(name.get(position));
tv2.setText("Connected Since:"+status.get(position));
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(getContext(),SingleUserProfileActivity.class);
intent.putExtra("key",key.get(position));
getContext().startActivity(intent);
}
});
return v;
}
}
Myactivity.java
public class ConnectedUsersFragment extends Fragment {
ListView connectedUsersList;
DatabaseReference connectedUsersReference;
DatabaseReference userInfoRefernce;
DatabaseReference presenceReference;
ArrayList<String> name=new ArrayList<>();
ArrayList<String> status=new ArrayList<>();
ArrayList<String> imgs=new ArrayList<>();
ArrayList<String> key=new ArrayList<>();
MyAdapter adapter;
FirebaseUser user;
public ConnectedUsersFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_connected_users, container, false);
connectedUsersList=v.findViewById(R.id.connected_users_list);
user=FirebaseAuth.getInstance().getCurrentUser();
presenceReference=FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid());
connectedUsersReference= FirebaseDatabase.getInstance().getReference().child("connected_users").child(user.getUid());
userInfoRefernce=FirebaseDatabase.getInstance().getReference().child("users");
adapter=new MyAdapter(getContext(),R.layout.single_user_layout,name,status,imgs,key);
connectedUsersList.setAdapter(adapter);
connectedUsersReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String userKey=dataSnapshot.getKey();
final String userConnectedDate=dataSnapshot.child("date").getValue(String.class);
userInfoRefernce.child(userKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String userKey=dataSnapshot.getKey();
String username=dataSnapshot.child("name").getValue(String.class);
String userstatus=dataSnapshot.child("profile_status").getValue(String.class);
String userimg=dataSnapshot.child("thumb_image").getValue(String.class);
name.add(username);
status.add(userConnectedDate);
imgs.add(userimg);
key.add(userKey);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toasty.error(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toasty.warning(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
return v;
}
@Override
public void onStart() {
super.onStart();
if(user!=null) {
presenceReference.child("online").setValue("true");
}
}
@Override
public void onResume() {
super.onResume();
if(user!=null) {
presenceReference.child("online").setValue("true");
}
}
@Override
public void onStop() {
super.onStop();
if(user!=null) {
presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
}
}
@Override
public void onPause() {
super.onPause();
if(user!=null) {
presenceReference.child("online").setValue(ServerValue.TIMESTAMP);
}
}
}
在 userInfoRefernce.child(userKey)
中,您设置了一个 ValueEventListener
,每次用户触发任何生命周期事件时都会触发该事件(请参阅 onStart、onResume、onPause 和 onStop)。尝试使用 ChildEventListener
并使用 Query 在下载数据之前过滤数据。
希望对您有所帮助。
我将 ValueEventListener() 替换为 ListenerForSingleValueEvent(),因为我想在这些页面上只显示一次监听事件,感谢@Victor Maldonado,我记得其中的区别:P