【问题标题】:Null pointer exception on null object reference空对象引用上的空指针异常
【发布时间】:2018-06-07 06:39:45
【问题描述】:

我在 DessertAdapter 类中不断收到空指针异常错误,从 holder.mName.setText(dessert.getName()); 行开始 我已经尝试了所有我知道的方法,但我仍然遇到同样的错误。 这是Adapter

public class DessertAdapter extends RecyclerView.Adapter<DessertAdapter.DessertVh> {
private List<Dessert> desserts = new ArrayList<>();
private static final int VIEW_TYPE_EMPTY_LIST_PLACEHOLDER = 0;
private static final int VIEW_TYPE_OBJECT_VIEW = 1;
private Context context;

@Override
public int getItemViewType(int position) {
    if (desserts.isEmpty()) {
        return VIEW_TYPE_EMPTY_LIST_PLACEHOLDER;
    } else {
        return VIEW_TYPE_OBJECT_VIEW;
    }
}
public DessertAdapter(Context context,List<Dessert> desserts) {
    this.context = context;
    this.desserts = desserts;      
}

// TODO: another placeholder stuff here
@Override
public DessertVh onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.item_dessert, parent, false);
    return new DessertAdapter.DessertVh(view);
}

@Override
public void onBindViewHolder(DessertVh holder, int position) {
    Dessert dessert = desserts.get(position);
    System.out.println(position);

    holder.mName.setText(dessert.getName());
    holder.mDescription.setText(dessert.getDescription());
    holder.mFirstLetter.setText(String.valueOf(dessert.getFirstLetter()));
    holder.mPrice.setText(String.valueOf(dessert.getAmount()));
}

@Override
public int getItemCount() {
        return desserts == null ? 0 : desserts.size();
}

public static class DessertVh extends RecyclerView.ViewHolder {

    private TextView mName;
    private TextView mPrice;
    private TextView mDescription;
    private TextView mFirstLetter;

    public DessertVh(View itemView) {
        super(itemView);

        mName = (TextView) itemView.findViewById(R.id.txt_name);
        mPrice = (TextView) itemView.findViewById(R.id.txt_price);
        mDescription = (TextView) itemView.findViewById(R.id.txt_desc);
        mFirstLetter = (TextView) itemView.findViewById(R.id.txt_firstletter);
    }
}

这是将数据保存到 Dessert 对象的类

public class AddGigActivity  extends AppCompatActivity {
private static String TAG = "AddGigActivity";
private ImageButton saveBtn;
private EditText gigName, gigDescrip, gigAmount;
private String userID;
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
private DatabaseReference myRef;


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

    gigName = (EditText)findViewById(R.id.gig_name);
    gigDescrip = (EditText)findViewById(R.id.gig_description);
    gigAmount = (EditText) findViewById(R.id.gig_amnt);
    saveBtn = (ImageButton) findViewById(R.id.mybtn_add);
    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef =  FirebaseDatabase.getInstance().getReference();
    FirebaseUser user = mAuth.getCurrentUser();
    userID = user.getUid();
    saveBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AddGig();
        }
    });

}


// real-time adding to the firebase database
private void AddGig(){
    String name = gigName.getText().toString();
    String descrip = gigDescrip.getText().toString();
    String amount = gigAmount.getText().toString();

    if((!TextUtils.isEmpty(name))&&(!TextUtils.isEmpty(descrip) && (!TextUtils.isEmpty(amount))) ){

        FirebaseUser user = mAuth.getCurrentUser();
        userID = user.getUid();
        String id =  myRef.push().getKey();
        Dessert dessert = new Dessert( name, descrip, amount);
       // myRef.child(id).setValue(dessert);
        myRef.child("users").child(userID).child("Gig posts").child(id).setValue(dessert);
        Toast.makeText(this, "Posted! ",Toast.LENGTH_LONG).show();
        finish();

    // you can still sprlit these to check for each text field
    }else{
        Toast.makeText(this, "One or more field(s) missing!",Toast.LENGTH_LONG).show();
    }
}

这里是主要的活动代码 sn-p,它在回收站视图上显示来自 firebase 的数据:

  public static class FeedsFragment extends Fragment {
    int color;

    public FeedsFragment() {
    }

    @SuppressLint("ValidFragment")
    public FeedsFragment(int color) {
        this.color = color;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dummy_fragment, container, false);
        final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dummyfrag_scrollableview);
        final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.dummyfrag_bg);
        frameLayout.setBackgroundColor(color);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);

        final List<Dessert> dessertList;
        dessertList = new ArrayList<>();
        //dessertList = new Dessert(context,"");


        final String curtUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
       // DatabaseReference mDatabaseGig = rootRef.child("users").child(curtUserId).child("Gig posts");
        final String id = rootRef.push().getKey();

        final DessertAdapter adapter = new DessertAdapter(getContext(), dessertList);
        recyclerView.setAdapter(adapter);

        rootRef.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                dessertList.clear();
                for(DataSnapshot gigSnapshot: dataSnapshot.getChildren()){
                    Dessert dessert = gigSnapshot
                            .child("users")
                            .child(curtUserId)
                            .child("Gig posts")
                            .child(id).getValue(Dessert.class);
                    dessertList.add(dessert);
                    adapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        // possible to put progress dialogue
        return view;
    }
}

您介意看一下代码并帮我整理一下吗?谢谢。

【问题讨论】:

  • dessertList = new ArrayList&lt;&gt;(); 你在向列表中添加数据吗?
  • 添加你的布局item_dessert
  • 是的,我正在向列表中添加数据。它工作正常,但自从我将数据重组为上图中的样子后,我一直遇到问题。
  • 我已经在 DessertAdapter 类中添加了 item_dessert。是否需要在 FeedsFragments 类中再次添加?

标签: android firebase firebase-realtime-database


【解决方案1】:

试试下面的适配器类

    public class DessertAdapter extends RecyclerView.Adapter<DessertAdapter.DessertVh> {
private List<Dessert> desserts;
private static final int VIEW_TYPE_EMPTY_LIST_PLACEHOLDER = 0;
private static final int VIEW_TYPE_OBJECT_VIEW = 1;

private Context context;

// TODO: placeholder stuff here

@Override
public int getItemViewType(int position) {
    if (desserts.isEmpty()) {
        return VIEW_TYPE_EMPTY_LIST_PLACEHOLDER;
    } else {
        return VIEW_TYPE_OBJECT_VIEW;
    }
}

public DessertAdapter(Context context,List<Dessert> desserts) {
    this.context = context;
    this.desserts = desserts;

    // desserts = Dessert.prepareDesserts(
    //       context.getResources().getStringArray(R.array.dessert_names),
    //       context.getResources().getStringArray(R.array.dessert_descriptions),
    //       context.getResources().getStringArray(R.array.dessert_amounts));
}


// TODO: another placeholder stuff here
@Override
public DessertVh onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view = inflater.inflate(R.layout.item_dessert, parent, false);
    return new DessertAdapter.DessertVh(view);
}

@Override
public void onBindViewHolder(DessertVh holder, int position) {


    holder.mName.setText(desserts.get(position).getName());
    holder.mDescription.setText(desserts.get(position).getDescription());
    holder.mFirstLetter.setText(String.valueOf(desserts.get(position).getFirstLetter()));
    holder.mPrice.setText(String.valueOf(desserts.get(position).getAmount()));


}

@Override
public int getItemCount() {
    // if nothing, return null,
    // else return the number of items in the list
    return desserts == null ? 0 : desserts.size();
}

public static class DessertVh extends RecyclerView.ViewHolder {

    private TextView mName;
    private TextView mPrice;
    private TextView mDescription;
    private TextView mFirstLetter;

    public DessertVh(View itemView) {
        super(itemView);

        mName = (TextView) itemView.findViewById(R.id.txt_name);
        mPrice = (TextView) itemView.findViewById(R.id.txt_price);
        mDescription = (TextView) itemView.findViewById(R.id.txt_desc);
        mFirstLetter = (TextView) itemView.findViewById(R.id.txt_firstletter);
    }
}

【讨论】:

    【解决方案2】:

    好的,我修好了! 这是代码

     public static class UserFeedFragment extends Fragment {
        int color;
    
        public UserFeedFragment() {
        }
    
        @SuppressLint("ValidFragment")
        public UserFeedFragment(int color) {
            this.color = color;
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.dummy_fragment, container, false);
            final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dummyfrag_scrollableview);
            final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.dummyfrag_bg);
            frameLayout.setBackgroundColor(color);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.setHasFixedSize(true);
    
            String curtUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
    
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference()
                    .child("users")
                    .child(curtUserId)
                    .child("Gig posts");
    
            final List<Dessert> dessertList = new ArrayList<Dessert>();
    
            final DessertAdapter adapter = new DessertAdapter(getContext(), dessertList);
            recyclerView.setAdapter(adapter);
    
            rootRef.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
    
                    dessertList.clear();
                    for(DataSnapshot gigSnapshot: dataSnapshot.getChildren()){
    
                        Dessert dessert = gigSnapshot
                                .getValue(Dessert.class);
                        dessertList.add(dessert);
                        adapter.notifyDataSetChanged();
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
            });
    
            // possible to put progress dialogue
            return view;
        }
    }
    

    我只需要改变就在这里

     DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference()
                    .child("users")
                    .child(curtUserId)
                    .child("Gig posts");
    

    然后在这里添加一个事件监听器

    rootRef.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
    

    它成功了! 不过我确实有一个小问题。我有两个提要片段:UserFeed 和 FeedsFragments。 Userfeed 获取当前用户发布的提要,而 FeedsFragment 旨在获取所有用户发布的提要。我试过这样做

     DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference()
                    .child("users")
                   // .child(curtUserId) I commented out the id of the user but nothing happened
                    .child("Gig posts");
    

    我的问题是:有没有办法可以“指导”引用来检索所有用户的帖子? 再次感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2015-11-24
      • 2013-01-18
      • 2018-09-13
      相关资源
      最近更新 更多