2017-12-26 19 views
-1

줄에서 시작하는 DessertAdapter 클래스에서 널 포인터 예외 오류가 계속 발생합니다. holder.mName.setText(dessert.getName()); 나는 알고있는 모든 방법을 시도했지만 여전히 동일한 오류가 발생합니다. 여기 는 디저트 객체에 데이터를 저장하는 클래스 Adapter 클래스 다음null 개체 참조에서 널 포인터 예외

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); 
    } 
} 

입니다 여기

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(); 
    } 
} 

되고 재활용보기에 중포 기지에서 데이터를 표시하는 주요 활동 코드 :

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; 
    } 
} 

제발 코드를 작성하고 교정 해 주시겠습니까? 고맙습니다.

+2

[NullPointerException이란 무엇이며 어떻게 수정합니까?] (https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix) -it) – ADM

+0

'dessertList = new ArrayList <>(); '목록에 데이터를 추가하고 있습니까? – gvmani

+0

레이아웃을 추가하십시오 'item_dessert' –

답변

0

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); 
    } 
} 
+0

나는 그것을 시도했지만, 불행히도 작동하지 않습니다. – user3267274

+0

모든 로그 오류 ..... – Omi

0

좋아 어댑터 클래스 아래에 시도, 그래서 그것을 고정! 는 여기에 내가 변경 한 모든

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

가 여기에

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

를 이벤트 리스너를 추가 여기

이었고, 그 일을 코드

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; 
    } 
} 

에게이야! 그래도 사소한 문제가 있습니다. 두 개의 피드 조각이 있습니다 : 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"); 

내 질문을한다하고 시도? 다시 한번 귀하의 도움에 미리 감사드립니다.