当前位置: 首页 > 知识库问答 >
问题:

难以获得儿童arraylist(firebase)

荣俊杰
2023-03-14

大家好,我正在尝试从firebase检索数据,并根据我单击的RecyclerView显示它们,并将名称传递给下一个活动。

每当我尝试这样做时,它总是会关闭应用程序并再次打开。

但是,每当集合中没有“Dates_Log_In”时,它就会运行,但不会显示任何类型的数据。

这是我用来显示RecyclerView中所有数据的类

public class Listing extends AppCompatActivity implements AttendanceListAdapter.OnNoteListener{

    Button back;
    DatabaseReference mRef;

    ArrayList<Attendance> userList;
    RecyclerView recyclerView;
    AttendanceListAdapter adapter;

    TextView name;
    TextView designation;
    TextView activity;
    TextView status;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);

        recyclerView = findViewById(R.id.rcl_List);
        back = findViewById(R.id.btn_go_back);
        name = findViewById(R.id.txt_name1);
        designation = findViewById(R.id.txt_designation1);
        activity = findViewById(R.id.txt_activity1);
        status = findViewById(R.id.txt_status1);

        mRef = FirebaseDatabase.getInstance().getReference("Users");

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        userList = new ArrayList<>();
        adapter = new AttendanceListAdapter(this, userList);
        recyclerView.setAdapter(adapter);

        mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for(DataSnapshot dataSnapshot : snapshot.getChildren()){

                    Attendance user = dataSnapshot.getValue(Attendance.class);
                    userList.add(user);
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(Listing.this, "Failed to retrieve Data", Toast.LENGTH_LONG).show();
            }
        });

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

    @Override
    public void onNoteClick(int position) {
        userList.get(position);

    }
}

考勤班

public class Attendance {

    public String fullname, designation, activity, status, date;

    private long maxid = 0;

    private DatabaseReference mref;
    public Attendance(){

    }
    public Attendance(String fullname, String designation, String activity, String status){

        this.fullname = fullname;
        this.designation = designation;
        this.activity = activity;
        this.status = status;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

    public void setActivity(String activity) {
        this.activity = activity;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getFullname(){
        return fullname;
    }
    public String getDesignation(){
        return designation;
    }
    public String getActivity(){
        return activity;
    }
    public String getStatus(){
        return status;
    }
    public String getDate(){
        return date;
    }
}

AttendanceListAdapter

public class AttendanceListAdapter extends RecyclerView.Adapter<AttendanceListAdapter.MyViewHolder> {

    ArrayList<Attendance> attendanceArrayList;
    Context context;

    public AttendanceListAdapter(Context context, ArrayList<Attendance> list){
        this.context = context;
        this.attendanceArrayList = list;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView name, designation, activity, status;

        public MyViewHolder(final View view){
            super(view);
            name = view.findViewById(R.id.txt_name1);
            designation = view.findViewById(R.id.txt_designation1);
            activity = view.findViewById(R.id.txt_activity1);
            status = view.findViewById(R.id.txt_status1);
        }
    }

    @NonNull
    @Override
    public AttendanceListAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull AttendanceListAdapter.MyViewHolder holder, int position) {

        Attendance user = attendanceArrayList.get(position);

        holder.name.setText(user.getFullname());
        holder.designation.setText(user.getDesignation());
        holder.activity.setText(user.getActivity());
        holder.status.setText(user.getStatus());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String id = user.getFullname();
                passData(id);

            }
        });

    }

    private void passData(String id) {

        Intent intent = new Intent(context,Logbook.class);
        intent.putExtra("id", id);
        context.startActivity(intent);
    }

    @Override
    public int getItemCount() {
        return attendanceArrayList.size();
    }

    public interface OnNoteListener{
        void onNoteClick(int position);
    }

}

这就是我传递数据的地方,它应该向列表视图显示“Dates_Log_In”(日期登录)(不确定这是否是正确的选择)

public class Logbook extends AppCompatActivity {

    Button back;
    DatabaseReference mRef;
    ListView listView;
    ArrayList<String> userList;
    ArrayAdapter<String> adapter;
    TextView txt_name;
    TextView txt_date;

    date Date;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logbook);

        Intent intent = getIntent();
        String id = intent.getStringExtra("id");

        Date = new date();

        listView = findViewById(R.id.list_date);
        back = findViewById(R.id.btn_go_back2);
        txt_name = findViewById(R.id.txt_nameselected);
        txt_date = findViewById(R.id.txt_date);
        txt_name.setText(id);

        mRef = FirebaseDatabase.getInstance().getReference("Users").child(id);
        userList = new ArrayList<>();
        adapter = new ArrayAdapter<String>(this, R.layout.logbook_layout, R.id.txt_date, userList);

        mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for(DataSnapshot dataSnapshot : snapshot.getChildren()){
                    Log.i("Dates_Log_In", dataSnapshot.getValue(String.class));
                    Date = dataSnapshot.getValue(date.class);
                    userList.add(Date.getDate());
                }
                listView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(Logbook.this, "Failed to retrieve Data", Toast.LENGTH_LONG).show();
            }
        });

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

测试运行期间,错误如下所示

E/le.enrollmentq: [qarth_debug:]  get PatchStore::createDisableExceptionQarthFile method fail.
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.enrollmentqr, PID: 3144
    com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.ArrayList to String
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertString(CustomClassMapper.java:426)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:217)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
        at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
        at com.example.enrollmentqr.Logbook$1.onDataChange(Logbook.java:64)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
        at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

在logcat中显示

2022-05-05 22:33:21.684 3144-3144/com.example.enrollmentqr W/ClassMapper: No setter/field for Dates_Log_In found on class com.example.enrollmentqr.Attendance
2022-05-05 22:33:21.700 3144-3144/com.example.enrollmentqr W/ClassMapper: No setter/field for Dates_Log_In found on class com.example.enrollmentqr.Attendance

这是我为数据库设定的规则。

{
  "rules": {
    ".read": true,
    ".write": true,
    "Users": {
        "Dates_Log_In":{
          "$uid":{
          ".read": true,
          ".write": true,
          }
        },
        "activity":{
        ".read": true,
        ".write": true,
        },
        "designation":{
        ".read": true,
        ".write": true,
        },
        "fullname":{
        ".read": true,
        ".write": true,
        },
        "status":{
        ".read": true,
        ".write": true,
        }
    }
  }
}

我有点知道,因为我没有在Attendance.class上包含日期,所以它给了一个空值(只是我的直觉)。所以我试着包含它,但这对我来说也没用。我有点猜测我如何调用Firebase有问题?我几天前才开始为我的项目做这个。

共有1个答案

明越
2023-03-14

这毫无意义:

Log.i("Dates_Log_In", dataSnapshot.getValue(String.class));
Date = dataSnapshot.getValue(date.class);

dataSnapshot可以是字符串,也可以是日期,但不能同时是两者。这意味着这些线路中至少有一条总是会失败。

既然你正在阅读这条路径:

mRef = FirebaseDatabase.getInstance().getReference("Users").child(id);

因此,您正在读取/User/$id,据我所知,它包含单个用户的数据。这意味着您不需要在onDataChange中循环遍历snapshot.getUNICEF,因为快照已经仅包含该单个用户的数据。

然后是下面的数据问题,如果没有看到您的实际JSON,很难确定。我可以推荐的最安全的方法是让Firebase弄清楚,然后在没有类型的情况下调用getValue()

mRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        Map<String, object> values = dataSnapshot.getValue();
        ...
    }

很可能你会得到一张地图

 类似资料:
  • 我有一个脚本,可以动态检索我编写的可配置产品的价格,现在我要返回并确保它考虑到可能存在的任何可配置属性。下面是通过ajax调用的,我已经将其调试到循环的最核心部分(因此所有magento方法都可以工作)。它应该删除与属性不匹配的子级。最终目标是只剩下一个孩子,并与价格相呼应。每个孩子确实包含一个独特的价格(这一点我知道)。你能明白为什么这现在不起作用吗?

  • 我试图使用继承创建一个银行系统,当子级BankAccount试图检索它的父值时,问题出现了,它得到了Bank类的初始值,numberAccounts = 0和空的registeredAccounts。 首先创建3个初始银行账户。 然后Bank类创建并生成它们给出的每个人的银行帐户和号码,numberAccounts和registeredAccounts的当前值应该已经更改。 当我尝试调用超类值来操

  • 我对gitlab ci子管道有问题。需要在具有多个应用程序的repo中的每次提交后自动触发ci管道。需要配置以检测哪些文件夹/文件被修改,以便知道要触发哪个应用程序管道 结构示例 Main“.gitlab ci.yml”是: appA1".gitlab-ci.yml"是: appA2“.gitlab ci.yml”是: 这种配置的目的是,例如,当我在应用**中更改文件时,管道会检测到更改并生成应用

  • 示范喷洒服务(路线): Redis执行元(Mock还没有实际的Redis客户端)

  • 昨天我在我的项目中添加了,现在当我离开并回到导航中的元素时,它会重新加载Sky,我得到 警告:儿童(…):遇到两个具有相同密钥的子项,。子密钥必须是唯一的;当两个子项共享密钥时,将只使用第一个子项。 (上面使用的数字50只是一个例子,它每次抛出这个错误~40次,都是不同的id) 这个问题似乎源于我的文件: 因为每次我进入另一个屏幕时,这个组件都会卸载,然后在我回来时重新安装。 当完成时,创建了一组

  • 本文向大家介绍儿童python练习实例,包括了儿童python练习实例的使用技巧和注意事项,需要的朋友参考一下 实例一: 题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列(只要百不等于十位并且不等于个位)。 实例(Python 2.0+) 实例二: 题目:企业发