Рассчитать количество элементов, отображаемых RecyclerView и поместить в TextView - PullRequest
0 голосов
/ 31 августа 2018

В настоящее время я могу отображать все элементы в моем RecyclerView. То, что я хочу сделать, это подсчитать, сколько из этих предметов есть. Мои предметы сохранены в CardView. Я не хочу вычислять или суммировать какое-либо конкретное поле, просто количество реальных элементов Вот мой код, и я попытался настроить его с помощью метода getItemCount() и прикрепить его к TextView и отобразить за пределами RecyclerView. Это не работает для меня:

public class COM800s1 extends AppCompatActivity {

private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference attendanceRef = db.collection("Attendance");
private AttendanceAdapter adapter;
private Context context;
private TextView attendanceNumbers;
private int counter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_com800s1);

    attendanceNumbers = findViewById(R.id.attendanceNums);

    FloatingActionButton floatingActionButton = findViewById(R.id.button_add_session);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(COM800s1.this,NewAttendanceRecord.class));
        }
    });

    setUpRecyclerView();


}

private void setUpRecyclerView() {
    final Query query = attendanceRef.whereEqualTo("sessionID", "5I0PLcpgmwdcjKLYLgkU").orderBy("userEmail", Query.Direction.ASCENDING);

    FirestoreRecyclerOptions<Attendance> options = new FirestoreRecyclerOptions.Builder<Attendance>()
            .setQuery(query, Attendance.class).build();


    adapter = new AttendanceAdapter(options);



    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

   //counter = adapter.getItemCount();
   //attendanceNumbers.setText("Currently " +counter+ " students have attended this session");


    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            adapter.deleteItem(viewHolder.getAdapterPosition());
        }
    }).attachToRecyclerView(recyclerView);

    adapter.setSetOnItemClickListener(new AttendanceAdapter.OnItemClickListener() {

        @Override
        public void onItemClick(Attendance documentSnapshot, int position) {

        }
    });

}

    @Override
    protected void onStart () {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop(){
        super.onStop();
        adapter.stopListening();
    }

}

Вот мой код адаптера:

public class AttendanceAdapter extends FirestoreRecyclerAdapter<Attendance, AttendanceAdapter.AttendanceHolder>{

private AttendanceAdapter.OnItemClickListener listener;

public AttendanceAdapter(@NonNull FirestoreRecyclerOptions<Attendance> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull AttendanceHolder holder, int position, @NonNull Attendance model) {
    holder.textViewStudent.setText(model.getUserEmail());
    holder.textViewTime.setText(model.getSignInTime());
    holder.textViewSession.setText(model.getSessionID());
    holder.textViewUserUID.setText(model.getUserUID());
}

@NonNull
@Override
public AttendanceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.attendance_item, parent, false);
    return new AttendanceAdapter.AttendanceHolder(v);
    }

public void deleteItem(int position){
    getSnapshots().getSnapshot(position).getReference().delete();
}

public int countItems(){
    return getItemCount();
}

class AttendanceHolder extends RecyclerView.ViewHolder {
    TextView textViewStudent;
    TextView textViewTime;
    TextView textViewSession;
    TextView textViewUserUID;

    public AttendanceHolder(View itemView){
        super(itemView);
        textViewStudent = itemView.findViewById(R.id.text_view_student_name);
        textViewTime = itemView.findViewById(R.id.text_view_course);
        textViewSession = itemView.findViewById(R.id.text_view_student_ID);
        textViewUserUID = itemView.findViewById(R.id.text_view_user_UID);


        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null){
                    listener.onItemClick(getSnapshots().get(position),position);
                }

            }
        });
    }
    }

public interface  OnItemClickListener{
    void onItemClick(Attendance documentSnapshot, int position);
}

public void setSetOnItemClickListener(AttendanceAdapter.OnItemClickListener listener){
    this.listener = listener;
}

Вот мой код обновлений, который возвращает объект нулевого указателя на onClickListener:

public class COM800s1 extends AppCompatActivity {

private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference attendanceRef = db.collection("Attendance");
private AttendanceAdapter adapter;
private TextView attendanceNumbers;
private TextView attendanceNumbs;
private Button attendanceButton;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_com800s1);
    attendanceNumbs = findViewById(R.id.attendanceNums);
    attendanceButton = findViewById(R.id.calculateAttendance);



    FloatingActionButton floatingActionButton = findViewById(R.id.button_add_session);
    floatingActionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(COM800s1.this,NewAttendanceRecord.class));
        }
    });

    setUpRecyclerView();

    attendanceButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            attendanceRef.whereEqualTo("sessionID", "5I0PLcpgmwdcjKLYLgkU").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {


                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        int count = 0;
                        for (DocumentSnapshot document : task.getResult()) {
                            count++;
                            attendanceNumbs = findViewById(R.id.attendanceNums);
                            attendanceNumbs.setText(count);
                        }
                        Log.d("TAG", count + "");
                    } else {

                    }
                }
            });

        }
    });


}

private void setUpRecyclerView() {
    final Query query = attendanceRef.whereEqualTo("sessionID", "5I0PLcpgmwdcjKLYLgkU").orderBy("userEmail", Query.Direction.ASCENDING);

    FirestoreRecyclerOptions<Attendance> options = new FirestoreRecyclerOptions.Builder<Attendance>()
            .setQuery(query, Attendance.class).build();



    adapter = new AttendanceAdapter(options);

    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);



    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            adapter.deleteItem(viewHolder.getAdapterPosition());
        }
    }).attachToRecyclerView(recyclerView);

    adapter.setSetOnItemClickListener(new AttendanceAdapter.OnItemClickListener() {

        @Override
        public void onItemClick(Attendance documentSnapshot, int position) {

        }
    });

}

    @Override
    protected void onStart () {
        super.onStart();
        adapter.startListening();

    }

    @Override
    protected void onStop(){
        super.onStop();
        adapter.stopListening();
    }

}

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Возможно, добавить что-то подобное в ваш класс AttendanceAdapter?

Я посмотрел на класс FirestoreRecyclerOptions, который предоставляет метод getSnapshots(). Это возвращает ObservableSnapshotArray, который, в свою очередь, расширяется от Base ObservableSnapshotArray, который предоставляет метод size().

class AttendanceAdapter extends FirestoreRecyclerAdapter<Attendance, AttendanceAdapter.AttendanceHolder>{
{ 
    private FirestoreRecyclerOptions<Attendance> options;

    public AttendanceAdapter(@NonNull FirestoreRecyclerOptions<Attendance> options)
    {
        super(options);
        this.options = options;
    }

    @Override
    public int getItemCount()
    {
        final int count = options.getSnapshots() != null 
            ? options.getSnapshots().size() 
            : 0;

        return count;
    }

Источники:

  1. FirestoreRecyclerOptions
  2. ObservableSnapshotArray
  3. BaseObservableSnapshotArray

Обновление : я вижу, что FirestoreRecyclerAdapter уже имеет метод getItemCount, и вы вызываете его. Возможно, данные еще не вернулись? Что вы видите за счет при печати?

0 голосов
/ 01 сентября 2018

Если вы пытаетесь сделать переменную counter глобальной переменной и использовать ее вне обратного вызова, она всегда будет null, потому что, как упоминал @Vinnie в своем ответе, данные еще не закончили загружаться. На самом деле происходит то, что вы пытаетесь получить данные из базы данных и сразу же использовать их, в то время как переменная counter имеет начальное значение 0. Затем, когда получение данных из базы данных завершается, оно меняет значение счетчика, но никогда больше не читается. Чтобы решить эту проблему, используйте ваш метод getItemCount() в классе адаптера, чтобы установить его значение TextView.

Если вы хотите посчитать количество документов под собранием, пожалуйста, смотрите мой ответ из этой записи .

0 голосов
/ 31 августа 2018

Если вы хотите получить список вашего recyclerView, просто создайте статический метод в адаптере вашего recyclerView и просто верните свой список в этом.

например:

public static List<modelOfYourList> getCount(){
   return yourAdapterList;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...