Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android ListView中显示Firebase项目?_Java_Android_Firebase - Fatal编程技术网

Java 如何在Android ListView中显示Firebase项目?

Java 如何在Android ListView中显示Firebase项目?,java,android,firebase,Java,Android,Firebase,我试图在Android ListView中显示一些Firebase记录。目前,当我进入一个新记录时,我的代码正在向列表视图返回一个单独的0,但是我的Firebase数据库完美地显示了我想要的信息 我在这个问题上花了相当多的时间,似乎不能很好地指出问题所在 在此方面的任何帮助都将不胜感激 以下是我显示/添加新记录的代码: TenantList tenantListAdapter; @Override protected void onCreate(Bundle saved

我试图在Android ListView中显示一些Firebase记录。目前,当我进入一个新记录时,我的代码正在向
列表视图返回一个单独的
0
,但是我的Firebase数据库完美地显示了我想要的信息

我在这个问题上花了相当多的时间,似乎不能很好地指出问题所在

在此方面的任何帮助都将不胜感激

以下是我显示/添加新记录的代码:

    TenantList tenantListAdapter;

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

        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        String uid = user.getUid();

        //databaseTenantsList = FirebaseDatabase.getInstance().getReference("tenants").child(uid);

        textViewPropertyName = (TextView) findViewById(R.id.textViewPropertyName);
        editTextTenantsName = (EditText) findViewById(R.id.editTextTenantsName);
        seekBarAge = (SeekBar) findViewById(R.id.seekBarAge);

        buttonAddTenant = (Button) findViewById(R.id.buttonAddTenant);

        listViewTenants = (ListView) findViewById(R.id.listViewTenants);
        tenants = new ArrayList<>();
        tenantListAdapter = new TenantList(this, tenants);
        listViewTenants.setAdapter(tenantListAdapter);

        Intent intent = getIntent();

        tenants = new ArrayList<>();

        String id = intent.getStringExtra(PropertyActivity.PROPERTY_ID);
        String name = intent.getStringExtra(PropertyActivity.PROPERTY_NAME);

        textViewPropertyName.setText(name);

        databaseTenants = FirebaseDatabase.getInstance().getReference("tenants").child(uid).child(id).child(uid);

        //databaseTenants = FirebaseDatabase.getInstance().getReference("tenants").child(id);

        buttonAddTenant.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveTenant();
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        databaseTenants.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                tenants.clear();

                for(DataSnapshot tenantSnapshot : dataSnapshot.getChildren()){
                    Tenant tenant = tenantSnapshot.getValue(Tenant.class);

                    tenants.add(tenant);
                }
                tenantListAdapter.notifyDatasetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    private void saveTenant() {

        String tenantName = editTextTenantsName.getText().toString().trim();
        int age = seekBarAge.getProgress();

        if(!TextUtils.isEmpty(tenantName)){

            String id = databaseTenants.push().getKey();

            Tenant tenant = new Tenant(id, tenantName, age);

            FirebaseUser user = mAuth.getCurrentUser();
            String uid = user.getUid();

            databaseTenants.child(uid).child(id).setValue(tenant);

            Toast.makeText(this, "Tenant saved successfully", Toast.LENGTH_LONG).show();

        } else {

            Toast.makeText(this, "Tenant name should not be empty", Toast.LENGTH_LONG).show();
        }
    }
}
租户列表租户列表适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u add\u租户);
mAuth=FirebaseAuth.getInstance();
FirebaseUser=mAuth.getCurrentUser();
字符串uid=user.getUid();
//databaseTenantsList=FirebaseDatabase.getInstance().getReference(“租户”).child(uid);
textViewPropertyName=(TextView)findViewById(R.id.textViewPropertyName);
editTextTenantsName=(EditText)findViewById(R.id.editTextTenantsName);
seekBarAge=(SeekBar)findViewById(R.id.seekBarAge);
buttonAddTenant=(按钮)findViewById(R.id.buttonAddTenant);
listViewTenants=(ListView)findViewById(R.id.listViewTenants);
租户=新的ArrayList();
tenantListAdapter=新租户列表(此为租户);
setAdapter(tenantListAdapter);
Intent=getIntent();
租户=新的ArrayList();
String id=intent.getStringExtra(PropertyActivity.PROPERTY\u id);
String name=intent.getStringExtra(PropertyActivity.PROPERTY\u name);
textViewPropertyName.setText(名称);
databaseTenants=FirebaseDatabase.getInstance().getReference(“租户”).child(uid).child(id).child(uid);
//databaseTenants=FirebaseDatabase.getInstance().getReference(“租户”).child(id);
buttonAddTenant.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
saveTenant();
}
});
}
@凌驾
受保护的void onStart(){
super.onStart();
databaseTenants.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
租户。清除();
对于(DataSnapshot tenantSnapshot:DataSnapshot.getChildren()){
Tenant-Tenant=tenantSnapshot.getValue(Tenant.class);
租户。添加(租户);
}
tenantListAdapter.notifyDatasetChanged();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
私有void saveTenant(){
字符串tenantName=editTextTenantsName.getText().toString().trim();
int age=seekBarAge.getProgress();
如果(!TextUtils.isEmpty(租户名称)){
String id=databaseTenants.push().getKey();
租户=新租户(id、租户名称、年龄);
FirebaseUser=mAuth.getCurrentUser();
字符串uid=user.getUid();
databaseTenants.child(uid).child(id).setValue(tenant);
Toast.makeText(此“租户已成功保存”,Toast.LENGTH_LONG.show();
}否则{
Toast.makeText(此“租户名称不应为空”,Toast.LENGTH_LONG.show();
}
}
}
租户列表

    public class TenantList extends ArrayAdapter<Tenant> {

    private Activity context;
    private List<Tenant> tenants;

    public TenantList(Activity context, List<Tenant> tenants) {

        super(context, R.layout.tenant_list_layout, tenants);
        this.context = context;
        this.tenants = tenants;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();

        View listViewItem = inflater.inflate(R.layout.tenant_list_layout, null, true);

        TextView textViewTenant = (TextView) listViewItem.findViewById(R.id.textViewTenant);
        TextView textViewAge = (TextView) listViewItem.findViewById(R.id.textViewAge);

        Tenant tenant = tenants.get(position);
        textViewTenant.setText(tenant.getTenantName());
        textViewAge.setText(String.valueOf(tenant.getTenantAge()));

        return listViewItem;

    }
}
公共类租户列表扩展了ArrayAdapter{
私人活动语境;
私人名单租户;
公共租户列表(活动上下文,租户列表){
超级(上下文,R.layout.tenant\u列表\u布局,租户);
this.context=上下文;
这个。租户=租户;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
LayoutInflater充气器=上下文。getLayoutInflater();
View listViewItem=充气机。充气(R.layout.tenant\u list\u layout,null,true);
TextView textViewTenant=(TextView)listViewItem.findViewById(R.id.textViewTenant);
TextView textViewAge=(TextView)listViewItem.findViewById(R.id.textViewAge);
租户=租户。获取(位置);
textViewTenant.setText(tenant.getTenantName());
textViewAge.setText(String.valueOf(tenant.getTenantAge());
返回listViewItem;
}
}
为了添加更多的上下文,以下是我的数据结构:


根据我所看到的,在到达tennat对象之前,还有一层

databaseTenants = FirebaseDatabase.getInstance().getReference("tenants").child(uid).child(id).child(uid);
另外,将适配器创建拉到onCreate方法,以便可以全局访问它:

添加成员变量:

TenantList tenantListAdapter
并在listview之后对其进行初始化,将Tennant拉到适配器实例化之前,以便您可以访问它:

listViewTenants = (ListView) findViewById(R.id.listViewTenants);
tenants = new ArrayList<>();
tenantListAdapter = new TenantList(this, tenants);
listViewTenants.setAdapter(tenantListAdapter);

谢谢你。不幸的是,我在
notifyDatasetChanged
处收到一个错误。我已经用你的解决方案更新了我的问题。你有什么建议吗?谢谢。对不起,我打错了,NotifyDataSetChanged将获得
0
作为输出。这出现在我的LogCat
04-01 16:11:51.753 9071-9071/com.example.xxx.myapplication E/SpannableStringBuilder:SPAN_EXCLUSIVE_EXCLUSIVE SPAN不能有零长度
。不确定这是否相关。能否发布您的tenantListAdapter?能否在此处添加断点tenantListAdapter.notifyDataSetChanged();检查一下房客名单上有没有什么?
databaseTenants.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                tenants.clear();

                for(DataSnapshot tenantSnapshot : dataSnapshot.getChildren()){ 
                    for(DataSnapshot lastSnapshot: tenantSnapshot.getChildren()){ 
                       Tenant tenant = lastSnapshot.getValue(Tenant.class); 
                       tenants.add(tenant); 
                    } 
                 } 
               tenantListAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });