2017-04-09 125 views
0

我正在使用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" 
    } 
    } 
} 
+0

您的Firebase數據庫的屏幕截圖請從 – Elsunhoty

+0

@Elsunhoty我正在從數據庫中獲取數據。當我調試並在'Businesses model = dataSnapshot.getValue(Businesses.class)'行放置斷點時,我可以看到它。但我用屏幕截圖更新了代碼 – user3920525

+0

[什麼是NullPointerException,以及如何解決它?]可能重複(http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how -do-i-fix-it) – 2017-04-09 18:57:55

回答

0

mBusinesses在你的活動和mBusinesses JSON文件是不同的東西,這就是其中的混亂髮生。

在你的活動已經初始化,並添加條目mBusinesses,但在創建RecyclerView當你通過它的片段的尚未初始化或有添加到它的任何數據,因此NullPointerExceptionmBusinesses對象!

爲此,片段需要將數據提供給RecyclerView,可能是通過加載Fragment中的數據或將數據傳遞給Fragment或其他方式。

+1

非常感謝! – user3920525

相關問題