有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java计算RecyclerView显示的项目数,并将其放置在TextView中

目前,我可以显示我的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) 个答案

  1. # 1 楼答案

    如果你想得到你的recyclerView列表,只需在你的recyclerView适配器中创建一个静态方法,并在其中返回你的列表即可

    例如:

    public static List<modelOfYourList> getCount(){
       return yourAdapterList;
    }
    
  2. # 2 楼答案

    也许可以在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方法,您正在调用它。也许数据还没有返回?打印出来的时候你看到了什么

  3. # 3 楼答案

    如果您试图将counter变量作为全局变量,并在回调之外使用它,那么它将始终是null,因为@Vinnie在他的回答中提到,数据尚未完成加载。真正发生的事情是,当counter变量的初始值为0时,您试图从数据库中获取数据并立即使用它。然后,当从数据库获取数据完成时,它会更改计数器的值,但不会再次读取。为了解决这个问题,在适配器类中使用getItemCount()方法的结果将其值设置为TextView

    如果您想计算一个集合下的文档数,请参阅我的回答