【问题标题】:Is there a way to total the number of items displayed in a recyclyerView有没有办法计算 recyclerView 中显示的项目数
【发布时间】:2019-02-06 19:31:12
【问题描述】:

我想汇总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

这是我在我的班级中创建适配器的地方:不是我的 adapterClass

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

【问题讨论】:

  • 目前这会导致应用程序崩溃
  • 请添加导致崩溃的logcat。另外,你在哪里使用setText 代码?
  • 在 logcat 上不是很清楚是什么原因造成的。我在 onCreate 方法中使用 setText
  • 当应用程序崩溃时,您可以在 logcat 中通过红色找到错误。否则,如果不知道是什么原因或对此有什么帮助,我们将无法为您提供帮助。您需要将其粘贴到此处。
  • 您是否在创建适配器之前调用attendanceNumbers.setText(adapter.getItemCount()...

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


【解决方案1】:

NullPointerException 是由您尝试调用的事实引起的

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

在创建 adapter 变量之前。 在适配器创建后移动上述语句将解决问题。

另外,请确保

attendanceNumbers = findViewById(R.id.attendanceNums);

在设置attendanceNumbers 文本之前调用。

【讨论】:

  • 我目前收到此错误消息:原因:java.lang.NullPointerException:尝试在 null 上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)'对象引用
【解决方案2】:

要求看起来你想观察计数

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,只需确保您在 setContentView 之后调用 setUpRecyclerView 方法,并且在您的活动 xml 布局中定义了 textView id 为 attendanceNums 例如 android:id="@+id/attendanceNums"

【讨论】:

  • 我在哪里放置第一段代码和最后一段对不起?这里有点困惑
  • 移动适配器类中的所有代码,除了最后一步,最后一步代码应该放在 setUpRecyclerView 中。还分享您设置布局 xml 的 onCreate/activity 代码,以便我们解决 NPE。
  • 当我这样安排时,我的 recyclerView 中的项目已经消失,TextView 仍然在说 TextView 并且没有按预期设置
  • 很难猜到你在代码中做了什么,最好也分享活动类。可以修改并分享。
猜你喜欢
  • 2017-01-09
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2023-02-22
  • 2020-12-10
  • 2023-03-17
相关资源
最近更新 更多