Есть ли способ подсчитать количество предметов, отображаемых в recyclyerView? - PullRequest
0 голосов
/ 31 августа 2018

Я бы хотел подсчитать количество предметов, отображаемых в recyclerView. В настоящее время я пытаюсь добиться этого с помощью TextView.

Вот код в моем Adapterclass

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

    return count;
}

Вот как я пытаюсь достичь этого в моем настоящем классе с recyclerview:

attendanceNumbers = findViewById(R.id.attendanceNums);
    attendanceNumbers.setText(adapter.getItemCount()+ " students have attended this session");

Вот мой полный класс адаптера

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

private AttendanceAdapter.OnItemClickListener listener;
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;
}

@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;
}

Вот ошибка logcat:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.dissertation.studentscanner.AttendanceAdapter.getItemCount()' on a null object reference

Здесь я создаю адаптер в своем классе: не мой адаптер. Класс

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);

    attendanceNumbers = findViewById(R.id.attendanceNums);
    attendanceNumbers.setText((adapter.getItemCount())+ " students have attended this session");

Ответы [ 2 ]

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

Требование выглядит так, как будто вы хотите соблюдать счет для

1) добавить студента

2) удалить учащегося и т. Д.

Для этого создайте обратный вызов, как показано ниже

public interface CountObserver {
  void onStudentsCount(int count);
}

Изменение в классе адаптера, чтобы передать обратный вызов

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

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

Последний шаг

CountObserver countObserver = new CountObserver(){
  public void onStudentsCount(int count){
      attendanceNumbers.setText(count+ " students have attended this session");
  }
}
adapter = new AttendanceAdapter(options,countObserver);

Для NPE просто убедитесь, что вы вызываете метод setUpRecyclerView после setContentView, и в макете xml вашей активности определено textView с идентификатором attendanceNums, например android:id="@+id/attendanceNums"

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

NullPointerException вызвано тем, что вы пытаетесь вызвать

attendanceNumbers.setText(adapter.getItemCount()+ " students have attended this session");

перед созданием переменной adapter. Перемещение вышеуказанного оператора после создания адаптера решит проблему.

Также убедитесь, что

attendanceNumbers = findViewById(R.id.attendanceNums);

вызывается перед установкой текста attendanceNumbers.

...