【问题标题】:How can I display Firebase items in Android ListView?如何在 Android ListView 中显示 Firebase 项目?
【发布时间】:2018-04-01 14:45:35
【问题描述】:

我正在尝试在 Android ListView 中显示一些 Firebase 记录。目前,当我输入新记录时,我的代码将一个单独的 0 返回到 ListView,但是我的 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();
        }
    }
}

租户列表

    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;

    }
}

添加更多上下文,这是我的数据结构:

【问题讨论】:

    标签: java android firebase


    【解决方案1】:

    从我看到的情况来看,在到达 Tennat 对象之前还有一层。

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

    另外,将您的适配器创建拉到 onCreate 方法,以便您可以全局访问它:

    添加成员变量:

    TenantList tenantListAdapter
    

    并在您的列表视图之后对其进行初始化,将租户拉到适配器实例化之前,以便您可以访问它:

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

    然后,在您的事件监听器中执行以下操作:

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

    【讨论】:

    • 谢谢。不幸的是,我在notifyDatasetChanged 收到错误消息。我已经用您实施的解决方案更新了我的问题。你有什么建议吗?谢谢。
    • 对不起,我打错了,是 notifyDataSetChanged
    • 仍然得到0 作为输出。这存在于我的 LogCat 04-01 16:11:51.753 9071-9071/com.example.xxx.myapplication E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 中。不确定是否相关
    • 你能发布你的tenantListAdapter吗?
    • 能否在此处添加断点tenantListAdapter.notifyDataSetChanged();并检查列表中的租户是否有任何内容?
    猜你喜欢
    • 2017-05-09
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2021-06-03
    相关资源
    最近更新 更多