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

时间:2018-08-31 15:47:24

标签: java android firebase android-recyclerview google-cloud-firestore

当前,我可以显示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 :(得分:0)

如果要获取recyclerView的列表,只需在recyclerView的适配器中创建一个静态方法,然后在其中返回列表即可。

例如:

public static List<modelOfYourList> getCount(){
   return yourAdapterList;
}

答案 1 :(得分:0)

Perhaps add something like this to your AttendanceAdapter class?

I took a look at the FirestoreRecyclerOptionsclass, which exposes a getSnapshots() method. This returns a ObservableSnapshotArray, which in turn extends from Base ObservableSnapshotArray, which exposes a size() method.

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

Sources:

  1. FirestoreRecyclerOptions
  2. 的文本
  3. ObservableSnapshotArray
  4. BaseObservableSnapshotArray

更新:我发现FirestoreRecyclerAdapter已经有一个getItemCount方法,您正在调用它。也许数据还没有返回?当您打印计数时会看到什么?

答案 2 :(得分:0)

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

如果您要计算集合下的文档数,请同时从此 post 中查看我的答案。