从Firebase数据库读取数据列表时出现空模型对象
我正在使用Firebase实时数据库填充使用材料设计卡片视图的recyclerview以显示不同类别的业务。从Firebase数据库读取数据列表时出现空模型对象
在我的导航抽屉中,我有一个类别列表,我将在该区域显示不同类型的业务。截至目前,我只是有膨胀期,以确保一切正常之前,我到其他片段nav categories这里是火力地堡数据库database
当我在“会计/财务”片段挖掘的截图一个片段我从Android Studios上得到一个显示java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
这将我带到我的Recyclerview Adapter类中的getItemCount()
。由于Model类为null,它返回null。如果我硬编码像10这样的数字返回getItemCount()
那么它会在onBindViewHolder()
中出现错误,我从业务列表中获得该位置。以下是我认为属于该问题的代码。一些代码将被删除,以尽可能简洁。
这是我从Firebase数据库获取数据并尝试将数据分配给Businesses.java模型类以便从recyclerview中读取的主要活动。
public class HomeScreenActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener
{
private List<Businesses> mBusinesses = new ArrayList<>();
private RecyclerViewAdapter mRecyclerViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_screen);
DatabaseReference database = FirebaseDatabase.getInstance().getReference().child("accounting");
database.addChildEventListener(new ChildEventListener()
{
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s)
{
Businesses model = dataSnapshot.getValue(Businesses.class);
mBusinesses.add(model);
}
});
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item)
{
int id = item.getItemId();
displaySelectedScreen(id);
item.setCheckable(true);
setTitle(item.getTitle());
return true;
}
private void displaySelectedScreen(int itemId)
{
Fragment fragment = null;
switch (itemId)
{
case R.id.nav_accounting_finance:
fragment = new AccountingFinanceFrag();
break;
}
if (fragment != null)
{
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.commit();
}
}
}
这里是我的模型上课的时候recyclerview从“会计/财务”被称为是返回null片段
@IgnoreExtraProperties
public class Businesses
{
public String Name;
public String About;
public String Picture;
public long Phone;
public Businesses()
{
}
public Businesses(String name, String about, String picture)
{
Name = name;
About = about;
Picture = picture;
}
}
这是我Recyclerview适配器类在那里我得到空模型对象应该有来自Firebase数据库的数据。
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder>
{
private Context mContext;
private List<Businesses> mBusinesses;
public RecyclerViewAdapter(Context context, List<Businesses> businesses)
{
mContext = context;
mBusinesses = businesses;
}
@Override
public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.card, parent, false);
return new RecViewHolder(view);
}
@Override
public void onBindViewHolder(RecViewHolder holder, int position)
{
Businesses businesses = mBusinesses.get(position);
holder.mName.setText(businesses.Name);
holder.mAbout.setText(businesses.About);
holder.bindGalleryItem(businesses);
}
@Override
public int getItemCount()
{
return mBusinesses.size();
}
public class RecViewHolder extends RecyclerView.ViewHolder
{
private CardView mCardView;
private Businesses mBusinesses;
private ImageView mImageView;
private TextView mName, mAbout;
RecViewHolder(View itemView)
{
super(itemView);
mCardView = (CardView) itemView.findViewById(R.id.card_view);
mImageView = (ImageView) itemView.findViewById(R.id.buisness_image);
mName = (TextView) itemView.findViewById(R.id.business_name);
mAbout = (TextView) itemView.findViewById(R.id.buisness_about);
}
public void bindGalleryItem(Businesses businesses)
{
mBusinesses = businesses;
Glide.with(mContext)
.load(businesses.Picture)
.placeholder(R.mipmap.ic_launcher)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.override(200, 200)
.into(mImageView);
}
}
}
而这就是recyclerview被充气的片段。
public class AccountingFinanceFrag extends Fragment
{
private List<Businesses> mBusinesses;
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private TextView mNameText, mAboutText;
private ImageView mImageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.fragment_category, container, false);
mNameText = (TextView) v.findViewById(R.id.business_name);
mAboutText = (TextView) v.findViewById(R.id.buisness_about);
mImageView = (ImageView) v.findViewById(R.id.buisness_image);
mRecyclerView = (RecyclerView) v.findViewById(R.id.fragment_recyclerview);
mAdapter = new RecyclerViewAdapter(getContext(), mBusinesses);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
return v;
}
}
在你的数据库碎片
{
"accounting" : {
"buisness_0" : {
"About" : "dummy text",
"Address" : "123 test ave test, test 00000",
"Email" : "[email protected]",
"Name" : "Test test",
"Owner" : "Test owner",
"Phone" : 4120000000,
"Picture" : "add link"
},
"business_1" : {
"About" : "dummy text",
"Address" : "123 test ave test, test 00000",
"Email" : "[email protected]",
"Name" : "Test test",
"Owner" : "Test owner",
"Phone" : 4120000000,
"Picture" : "add link"
}
}
}
mBusinesses
在你的活动和mBusinesses
JSON文件是不同的东西,这就是其中的混乱发生。
在你的活动已经初始化,并添加条目mBusinesses
,但在创建RecyclerView当你通过它的片段的尚未初始化或有添加到它的任何数据,因此NullPointerException
mBusinesses
对象!
为此,片段需要将数据提供给RecyclerView,可能是通过加载Fragment中的数据或将数据传递给Fragment或其他方式。
非常感谢! – user3920525
您的Firebase数据库的屏幕截图请从 – Elsunhoty
@Elsunhoty我正在从数据库中获取数据。当我调试并在'Businesses model = dataSnapshot.getValue(Businesses.class)'行放置断点时,我可以看到它。但我用屏幕截图更新了代码 – user3920525
[什么是NullPointerException,以及如何解决它?]可能重复(http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how -do-i-fix-it) – 2017-04-09 18:57:55