【问题标题】:Failed to show data retrieved from Firebase in RecyclerView无法在 RecyclerView 中显示从 Firebase 检索到的数据
【发布时间】:2019-12-07 01:42:39
【问题描述】:

我相信我的 recyclerView 已成功从 firebase 检索数据,因为它在我的 recycler 视图中显示了 2 个 cardView,这与我在菜单下的 firebase 内分配的数据数量相同。

Screenshot of my RecyclerView

我有 3 个类,它们是 listOnline2、MyAdapter 和 cMenu。 lisOnline2 和 MyAdapter 内部都有一个数组。我使用 listOnline2 中的数组存储从 firebase 检索到的数据,并在 MyAdapter 中使用数组来查看 cardview 中的数据。下面是我对 listOnline2 类的编码。

`DatabaseReference currentUserRef,counterRef, ref;
MyAdapter adapterR;

RecyclerView listOnline21;
ArrayList <cMenu> menu;
private static final String TAG = "listOnline2";

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

    listOnline21= (RecyclerView) findViewById(R.id.listMenu);
    listOnline21.setLayoutManager( new LinearLayoutManager( listOnline2.this ) );
    listOnline21.setHasFixedSize(true);
menu= new ArrayList<cMenu>();


    counterRef= FirebaseDatabase.getInstance().getReference().child( "Menu" ).child( "twRAlXRMSgPkA35nmMoFAuAsTdz1" );
    Log.d( TAG, "Clicked ID: "+idd );
    currentUserRef=FirebaseDatabase.getInstance().getReference("Menu").child( FirebaseAuth.getInstance().getCurrentUser().getUid() );

    counterRef.addValueEventListener( new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){

                cMenu p=dataSnapshot1.getValue(cMenu.class);
                menu.add(p);

            }
            Log.d( TAG, "Data of array: "+menu );
            adapterR=new MyAdapter( listOnline2.this, menu );
            listOnline21.setAdapter( adapterR );
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(listOnline2.this, "Opsss.... Something is wrong", Toast.LENGTH_SHORT).show();
        }
    } );

    Toolbar toolbar=findViewById(R.id.toolbar);
    toolbar.setTitle("Food Ordering Delivery System");
    setSupportActionBar(toolbar);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater= getMenuInflater();
    inflater.inflate( R.menu.main_menu,menu );
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.action_cart:
            Intent toCart=new Intent( listOnline2.this, Cart.class );
            startActivity( toCart );
            break;

        case R.id.action_logout:
            Intent toLogin=new Intent( listOnline2.this, LoginActivity.class );
            startActivity( toLogin );

            break;
    }
    return super.onOptionsItemSelected( item );
}`

同时,下面是我在 MyAdapter 类中的代码

DatabaseReference currentUserRef,counterRef;
MyAdapter adapterR;

RecyclerView listOnline21;
ArrayList <cMenu> menu;
private static final String TAG = "listOnline2";

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

    listOnline21= (RecyclerView) findViewById(R.id.listMenu);
    listOnline21.setLayoutManager( new LinearLayoutManager( listOnline2.this ) );
    listOnline21.setHasFixedSize(true);
       menu= new ArrayList<cMenu>();


    counterRef= FirebaseDatabase.getInstance().getReference().child( "Menu" ).child( "twRAlXRMSgPkA35nmMoFAuAsTdz1" );
    Log.d( TAG, "Clicked ID: "+idd );
    currentUserRef=FirebaseDatabase.getInstance().getReference("Menu").child( FirebaseAuth.getInstance().getCurrentUser().getUid() );

    counterRef.addValueEventListener( new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){

                cMenu p=dataSnapshot1.getValue(cMenu.class);
                menu.add(p);

            }
            Log.d( TAG, "Data of array: "+menu );
            adapterR=new MyAdapter( listOnline2.this, menu );
            listOnline21.setAdapter( adapterR );
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(listOnline2.this, "Opsss.... Something is wrong", Toast.LENGTH_SHORT).show();
        }
    } );

    Toolbar toolbar=findViewById(R.id.toolbar);
    toolbar.setTitle("Food Ordering Delivery System");
    setSupportActionBar(toolbar);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater= getMenuInflater();
    inflater.inflate( R.menu.main_menu,menu );
    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.action_cart:
            Intent toCart=new Intent( listOnline2.this, Cart.class );
            startActivity( toCart );
            break;

        case R.id.action_logout:
            Intent toLogin=new Intent( listOnline2.this, LoginActivity.class );
            startActivity( toLogin );

            break;
    }
    return super.onOptionsItemSelected( item );
}

最后一个类是cMenu如下:

private String fName, fDesc, fImage, fQuantity, fPrice, fId;

public cMenu() {
}

public cMenu(String fName, String fDesc, String fImage, String fQuantity, String fPrice, String fId) {
    this.fName = fName;
    this.fDesc = fDesc;
    this.fImage = fImage;
    this.fQuantity = fQuantity;
    this.fPrice = fPrice;
    this.fId = fId;
}

public String getfName() {
    return fName;
}

public void setfName(String fName) {
    this.fName = fName;
}

public String getfDesc() {
    return fDesc;
}

public void setfDesc(String fDesc) {
    this.fDesc = fDesc;
}

public String getfImage() {
    return fImage;
}

public void setfImage(String fImage) {
    this.fImage = fImage;
}

public String getfQuantity() {
    return fQuantity;
}

public void setfQuantity(String fQuantity) {
    this.fQuantity = fQuantity;
}

public String getfPrice() {
    return fPrice;
}

public void setfPrice(String fPrice) {
    this.fPrice = fPrice;
}

public String getfId() {
    return fId;
}

public void setfId(String fId) {
    this.fId = fId;
}

我可以做些什么来显示我存储从 Firebase 检索到的数据的数组中的数据?请给我一个建议,因为我花了 2 天时间盯着这些代码。提前谢谢!

【问题讨论】:

    标签: java firebase-realtime-database android-recyclerview


    【解决方案1】:

    我解决了!我从 cMenu 类中更改了 3 个变量。

    fName 到 menuName

    fDesc to foodDescription

    fPrice to price

    这些变量需要更改才能从 firebase 查看数据的原因是 setter getter 类中的变量需要与数据库中的变量名称相同。您可以在问题部分查看我的数据库截图。感谢您的努力!

    【讨论】:

      【解决方案2】:

      int id=FirebaseAuth.getInstance.getCurrentUser.getUid(); currentUserRef=FirebaseDatabase.getInstance().getReference().child("Menu").child(id);

      【讨论】:

      • 对不起,在我的菜单下它不是当前用户的 ID。感谢您的尝试!
      【解决方案3】:

      输入OnCreate method

      adapterR=new MyAdapter( listOnline2.this, menu );
      listOnline21.setAdapter( adapterR );
      

      使用此行onDataChange method

      adapterR.notifyDataSetChanged();
      

      【讨论】:

      • 我认为recyclerView 不能通知DataSetChanged。只有适配器可以。如果我错了,请纠正我。
      • 是的,对不起,我的坏适配器只能 notifyDataSetChanged
      猜你喜欢
      • 2023-04-03
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2021-09-14
      • 2020-05-09
      • 1970-01-01
      相关资源
      最近更新 更多