我正在使用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"
}
}
}
您的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