2017-04-09 98 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

相关问题