【问题标题】:Calculate the number of items displayed by RecyclerView and place in a TextView计算RecyclerView显示的item个数,放到一个TextView中
【发布时间】:2019-02-06 16:35:36
【问题描述】:

目前我可以显示我的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();
    }

}

【问题讨论】:

  • 您能告诉我们您的出勤适配器代码吗?
  • 我已经根据我在您的AttendanceAdapter 代码中观察到的内容更新了我的答案。
  • 您能否发布崩溃的堆栈跟踪信息?

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


【解决方案1】:

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

例如:

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

【讨论】:

  • 我希望返回列表中的项目数,而不是实际列表本身?
  • 所以我的列表的模型是出勤,但我不确定 yourAdapterList 是什么意思?
  • 方法名并不能真正反映返回类型。
  • 如果你想要你刚才使用的大小yourList.size()
【解决方案2】:

也许在您的AttendanceAdapter 类中添加类似的内容?

我查看了FirestoreRecyclerOptionsclass,它公开了一个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 方法并且您正在调用它。也许数据还没有返回?打印时看到的计数是什么?

【讨论】:

  • 我已经使用了上面的 getItemCount 方法,但现在不知道如何在我原来的活动中调用它?
  • 当我添加此代码时,应用程序崩溃。有什么建议为什么会发生这种情况?
  • 你能发布崩溃日志/堆栈跟踪吗?
【解决方案3】:

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

如果你想统计一个集合下的文档数量,也请查看我在这个 post 的回答。

【讨论】:

  • alex malmo 我使用了您在帖子中建议的代码,那么如何在 TextView 中显示总数?
  • 只要找到TextView并在上面使用setText()方法,对吧?
  • Alex 请看上面我的代码,我仍然得到一个空对象引用错误,只是这次在 onClick 方法上
  • 现在出现在哪一行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多