# #android #firebase #firebase-realtime-database #android-recyclerview
Вопрос:
Я хочу получить все данные, а не только последние 2 набора.
Существуют ли какие-либо решения для извлечения всех данных из firebase?
Это потому, что у цикла for или списка массивов возникли проблемы?
=================================================
Обновленное Фото
Я пытаюсь получить данные [математически,пароль и временную]
Но выводом являются только два набора данных внутри ключа [Mdl3FODHWV6zv9d2rNr]
Когда я пытаюсь щелкнуть по каждому виду карты, вывод данных является единственной третьей выходной фотографией для трех из этих видов карты.
Выход:
=================================================
Userlist1.java
public class userlist1 extends AppCompatActivity {
RecyclerView recyclerView;
DatabaseReference database,ab;
MyAdapter1 myAdapter1;
ArrayList<Report1> list;
String uid;
private FirebaseAuth auth;
private FirebaseUser user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userlist1);
user = auth.getInstance().getCurrentUser();
uid = user.getUid();
recyclerView = findViewById(R.id.userlist1);
SharedPreferences sharedPreferences = getSharedPreferences("myKey", MODE_PRIVATE);
String key = sharedPreferences.getString("key","");
String temp = sharedPreferences.getString("temp","");
database = FirebaseDatabase.getInstance().getReference("Class Information");
ab = database.child(uid).child("Student Attend").child(key).child("Attendance");
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
list = new ArrayList<>();
myAdapter1 = new MyAdapter1(this,list);
recyclerView.setAdapter(myAdapter1);
ab.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren()){
Report1 report1 = dataSnapshot.getValue(Report1.class);
list.add(report1);
}
myAdapter1.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
MyAdapter1.java:
public class MyAdapter1 extends RecyclerView.Adapter<MyAdapter1.MyViewHolder> {
Context context;
ArrayList<Report1> list;
public MyAdapter1(Context context, ArrayList<Report1> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.item1,parent,false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
Report1 report1 = list.get(position);
holder.matricno.setText(report1.getMatricno());
holder.password.setText(report1.getPassword());
holder.temp.setText(report1.getTemp());
}
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView matricno, password, temp;
public View view;
public MyViewHolder(@NonNull View itemView){
super(itemView);
matricno = itemView.findViewById(R.id.tvmno);
password = itemView.findViewById(R.id.tvpassword);
temp = itemView.findViewById(R.id.tvtemperature);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View itemView) {
Toast.makeText(itemView.getContext(), "Data added into database", Toast.LENGTH_SHORT).show();
}
});
}
}
}
Report1.java:
public class Report1 {
public String matricno;
public String password;
public String temp;
public Report1(){
}
public String getMatricno() {
return matricno;
}
public String getPassword() {
return password;
}
public String getTemp() {
return temp;
}
}
================================================================
Updated New Code
Userlist.java
public class userlist extends AppCompatActivity {
RecyclerView recyclerView;
DatabaseReference database, ab;
MyAdapter myAdapter;
ArrayList<Report> list;
String uid;
private FirebaseAuth auth;
private FirebaseUser user;
Menu menu;
private SearchView searchView = null;
private SearchView.OnQueryTextListener queryTextListener;
SharedPreferences sharedpreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userlist);
user = auth.getInstance().getCurrentUser();
uid = user.getUid();
recyclerView = findViewById(R.id.userlist);
searchView = findViewById(R.id.action_search);
SharedPreferences sharedPreferences = getSharedPreferences("myKey", MODE_PRIVATE);
String key = sharedPreferences.getString("key","");
String temp = sharedPreferences.getString("temp","");
database = FirebaseDatabase.getInstance().getReference("Class Information");
ab = database.child(uid).child("Student Attend");
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
list = new ArrayList<>();
myAdapter = new MyAdapter(this, list);
recyclerView.setAdapter(myAdapter);
ab.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Report report = dataSnapshot.getValue(Report.class);
list.add(report);
}
myAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
// listening to search query text change
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// filter recycler view when query submitted
myAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
// filter recycler view when text is changed
myAdapter.getFilter().filter(query);
return false;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_dateascending:
Collections.sort(list, Report.ReportDateOldestComparator);
Toast.makeText(userlist.this, "Sort by Date [Oldest - Latest]", Toast.LENGTH_SHORT).show();
myAdapter.notifyDataSetChanged();
return true;
case R.id.menu_descending:
Collections.sort(list, Report.ReportDateLatestComparator);
Toast.makeText(userlist.this, "Sort by Date [Latest - Oldest]", Toast.LENGTH_SHORT).show();
myAdapter.notifyDataSetChanged();
return true;
case R.id.action_search:
// Not implemented here
return false;
default:
break;
}
searchView.setOnQueryTextListener(queryTextListener);
return super.onOptionsItemSelected(item);
}
}
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>implements Filterable {
Context context;
ArrayList<Report> list;
ArrayList<Report> listfilter;
SharedPreferences sharedpreferences;
public MyAdapter(Context context, ArrayList<Report> list) {
this.context = context;
this.list = list;
this.listfilter = list;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
Report report = list.get(position);
holder.time.setText(report.getTime());
holder.duration.setText(report.getDuration());
holder.info.setText(report.getInfo());
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
list = listfilter;
} else {
List<Report> filteredList = new ArrayList<>();
for (Report row : listfilter) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getInfo().toLowerCase().contains(charString.toLowerCase()) || row.getTime().contains(charSequence)) {
filteredList.add(row);
}
}
list = (ArrayList<Report>) filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = list;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
list = (ArrayList<Report>) filterResults.values;
notifyDataSetChanged();
}
};
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView duration, time, info;
public View view;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
time = itemView.findViewById(R.id.tvtemp);
duration = itemView.findViewById(R.id.tvfirstName);
info = itemView.findViewById(R.id.tvmatno);
SharedPreferences sharedPreferences = context.getSharedPreferences("myKey", Context.MODE_PRIVATE);
String key = sharedPreferences.getString("key","");
String temp = sharedPreferences.getString("temp","");
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View itemView) {
sharedpreferences = context.getSharedPreferences("myKey", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("key", key);
editor.putString("temp", temp);
editor.apply();
Intent intent = new Intent(itemView.getContext(), userlist1.class);
itemView.getContext().startActivity(intent);// pass key to next activity;
Toast.makeText(itemView.getContext(), "Data retrieved from database", Toast.LENGTH_SHORT).show();
}
});
}
}
}
Report.java
public class Report {
public String duration;
public String time;
public String info;
public Report(){
}
public void setDuration(String duration) {
this.duration = duration;
}
public void setTime(String time) {
this.time = time;
}
public void setInfo(String info) {
this.info = info;
}
public String getDuration() {
return duration;
}
public String getTime() {
return time;
}
public String getInfo() {
return info;
}
public static Comparator<Report> ReportDateOldestComparator = new Comparator<Report>() {
@Override
public int compare(Report o1, Report o2) {
return o1.getTime().compareTo(o2.getTime());
}
};
public static Comparator<Report> ReportDateLatestComparator = new Comparator<Report>() {
@Override
public int compare(Report o1, Report o2) {
return o2.getTime().compareTo(o1.getTime());
}
};
}
Комментарии:
1. Насколько я вижу, прослушиватель, к которому вы прикрепляете
ab
, уже читает и обрабатывает всеAttendance
записи. Но поскольку в базе данных есть только два дочерних узла, она, конечно, будет показывать только эти два узла в приложении. Может быть, я не понимаю проблемы, поэтому не могли бы вы отредактировать свой вопрос, чтобы уточнить: когда вы строчно просматриваете свой код в отладчике, какая конкретная строка не делает того, чего вы от нее ожидаете?2. @FrankvanPuffelen Я просто обновляю изображения и вопросы выше. Вы не могли бы протянуть мне руку помощи?
3. Пользовательский интерфейс показывает только узлы посещаемости первого дочернего узла, потому что это то, что вы указываете ему для загрузки из базы данных здесь:
ab = database.child(uid).child("Student Attend").child(key).child("Attendance")
. Вы вместо этого ищете его для загрузки всех узлов посещаемости под любымStudent Attend
?4. Да, совершенно верно, Фрэнк!
5. CardView [a] = [MdkeONsLFaBKDgyKMU] CardView [b] = [Mdkf_TBTWI4D6yRyGLa] amp; [MdkfYdaClyJXCIT2XEN] CardView [c] = [Mdl3FODHWV6zv9d2rNr]] и многое другое
Ответ №1:
Если вы хотите загрузить Attendance
данные со всех дочерних узлов Student Attend
, вам сначала нужно загрузить данные со всех этих узлов:
ab = database.child(uid).child("Student Attend");
...
ab.addListenerForSingleValueEvent(new ValueEventListener() {
...
Поскольку мы будем загружать данные с более высокого уровня в базу данных, нам нужно будет перейти key
по "Attendance"
вашему onDataChange
методу и прямо сейчас:
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
// 👇 loop over `key` level children
for(DataSnapshot childSnapshot : snapshot.getChildren()) {
// 👇 loop over Attendance children
for(DataSnapshot dataSnapshot : childSnapshot.child("Attendance").getChildren()){
Report1 report1 = dataSnapshot.getValue(Report1.class);
list.add(report1);
}
}
myAdapter1.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // 👈 never ignore errors
}
Комментарии:
1. спасибо за ваш код, я наконец-то смогу восстановить каждую посещаемость. Теперь у меня есть новая проблема. Я пытаюсь реализовать OnClickListener на userlist.java для того, чтобы получить конкретные данные в userlist1.java. Могу я узнать, как исправить мой код?
2. Надеюсь, что результаты приведены в [обновленное изображение 3] : Onclick[информация:test3] -> отображение 1 посещаемости //Onclick[информация:rea] ->>отображение 2 посещаемости