Вы можете получить последние наборы данных в firebase только через recyclerview

# #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 посещаемости