Java 如何在Android ListView中显示Firebase项目?
我试图在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
列表视图返回一个单独的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
作为输出。这出现在我的LogCat04-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) {
}
});