0

Ich habe Bilder in einer Recycleransicht angezeigt, die aus einer Firebase-Datenbank abgerufen wurden. Ich versuche, einen Alphabet-Index zu implementieren, so dass, wenn ich auf einen Buchstaben klicke, der Name des Bildes abgerufen wird. Ich wende dann einen Teilstring an, um das erste Zeichen des Namens zu erhalten, benutze das equals(), um zu prüfen, ob das Zeichen dem angeklickten Buchstaben entspricht, und entferne das Element aus der Recycleransicht, wenn es nicht gleich ist. Das Problem ist, wenn ich die Teilzeichenfolge anwende, wird eine Nullzeigerausnahme erzeugt. Ich weiß, dass ich den Namen des Bildes erfolgreich abrufen kann, da ich Toast verwenden kann, um es auf dem Bildschirm anzuzeigen. Ich weiß nicht, was die Nullzeiger-Ausnahme verursacht, wenn ich versuche, den Teilstring zu bekommen. Jede Hilfe wäre willkommen. HierAbgerufene Daten von Firebase, aber eine Nullzeigerausnahme erhalten, wenn versucht wird, die abgerufenen Daten zu verwenden

ist der Code von Haupttätigkeit - das Problem in der updateLogoDisplay ist():

public class AddBrandPage extends AppCompatActivity implements OnClickListener { 

    //declare variables 
    private RecyclerView recyclerView; 
    private RecyclerView.LayoutManager layoutManager; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView alpharecyclerView; 
    private RecyclerView.LayoutManager alphaLayoutManager; 
    private RecyclerView.Adapter alphaAdapter; 
    private DatabaseReference myRef; 
    private DatabaseReference userRef; 
    private Button btn_skip; 
    private Button btn_save; 
    private CheckBox checkbox; 
    private FirebaseAuth mAuth; 
    private String t; 

    List<LogoItems> brandLogo = new ArrayList<>(); 
    //HashMap<String, String> saveBrands = new HashMap<>(); 
    List<LogoItems> removedBrandLogo = new ArrayList<>(); 
    List<String> selectionList = new ArrayList<>(); 
    List<AlphaItems> alphaList = new LinkedList<>(); 


    String [] alphabets = {"All","A","B", "C", "D", "E", "F", "G", "H", "I", 
      "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_add_brand_page); 

     //initialize variables 
     btn_skip = (Button) findViewById(R.id.btn_skip); 
     btn_save = (Button) findViewById(R.id.btn_save); 
     myRef = FirebaseDatabase.getInstance().getReference().child("/brands"); 
     userRef = FirebaseDatabase.getInstance().getReference().child("/users"); 
     // checkbox = (CheckBox) findViewById(R.id.checkbox); 

     //calls to load data to arraylists 
     //alpha = getResources().getStringArray(alphabets); 

     loadAlpha(); 
     loadLogoImgData(); 


     //set the listener for the buttons click event 
     btn_skip.setOnClickListener(this); 
     btn_save.setOnClickListener(this); 


    } 

    private void loadAlpha() { 

     for (String alpha: alphabets) { 
      alphaList.add(new AlphaItems(alpha)); 

     } 
     startAlphaRecyclerView(); 

    } 

    public void loadLogoImgData() { 

     brandLogo.clear(); 
     myRef.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for (DataSnapshot brandSnapshot : dataSnapshot.getChildren()) { 
        LogoItems value = brandSnapshot.getValue(LogoItems.class); 
        brandLogo.add(value); 
       } 
       startLogoRecyclerView(); 
      } 


      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 


    @Override 
    public void onClick(View view) { 

     if (view == btn_skip) { 
      //if skip button clicked close current window and go to user main page 
      finish(); 
      startActivity(new Intent(getApplicationContext(), UserMainPage.class)); 

     } 
     if (view == btn_save) { 
      //selector.addAll(logoadapter.selector); 
      saveData(); 
     } 

    } 


    public void startLogoRecyclerView() { 
     // set the main recyclerview view for the logo in the layout 
     recyclerView = (RecyclerView) findViewById(R.id.recylView); 
     recyclerView.setHasFixedSize(true); 

     // set the main layoutManager of the recyclerview 
     layoutManager = new GridLayoutManager(this, 2); 
     recyclerView.setLayoutManager(layoutManager); 

     // set the recycler view adapter 
     adapter = new LogoAdapter(brandLogo, getBaseContext(), AddBrandPage.this); 
     recyclerView.setAdapter(adapter); 

    } 

    public void startAlphaRecyclerView() { 
     // set the main recyclerview view for the logo in the layout 
     alpharecyclerView = (RecyclerView) findViewById(R.id.alpharecyclerView); 
     alpharecyclerView.setHasFixedSize(true); 

     // set the main layoutManager of the recyclerview 
     alphaLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false); 
     alpharecyclerView.setLayoutManager(alphaLayoutManager); 

     // set the recycler view adapter 
     alphaAdapter = new AlphaAdapter(alphaList, getBaseContext(), AddBrandPage.this); 
     alpharecyclerView.setAdapter(alphaAdapter); 

    } 



    public List<String> prepareSelection(View v, int position) { 

     checkbox = (CheckBox) v; 

     //check if user selected checkbox and add or remove from list 
     //if (checkbox.isChecked()) { 
     selectionList.add(brandLogo.get(position).getName()); 

     //} else { 
     // selectionList.remove(brandLogo.get(position).getLogo()); 

     //} 
     return selectionList; 
    } 



    public void updateLogoDisplay(String letter) { 

     if (!(letter.equals("All"))) { 
      //Iterator<LogoItems> iter = brandLogo.iterator(); 

      for (Iterator<LogoItems> iter = brandLogo.iterator(); iter.hasNext();){ 
      //while (iter.hasNext()) { 
       LogoItems r = iter.next(); 
       String c = r.getName(); 
       String t = c.substring(0,1); 
       if (c != null){ 
        if (letter.equals(t)) { 


        //brandLogo.remove(r); 
        removedBrandLogo.add(r); 
        iter.remove(); 

       } 
       }else { 
       } 
      } 
      brandLogo.removeAll(removedBrandLogo); 
      adapter.notifyDataSetChanged(); 
     } 

    } 


    public void saveData() { 

     final FirebaseAuth mAuth; 
     final DatabaseReference userRef; 

     mAuth = FirebaseAuth.getInstance(); 
     userRef = FirebaseDatabase.getInstance().getReference().child("users"); 
     DatabaseReference curUser = userRef.child(mAuth.getCurrentUser().getUid()); 
     curUser.child("brands").setValue(selectionList);//save selected items to the database 

    } 

} 

Hier ist der Code für die Recycler Ansicht Adapter, von dem die updateLogoDisplay() aufgerufen wird. Hier

public class AlphaAdapter extends RecyclerView.Adapter<AlphaAdapter.AlphaViewHolder> { 

    //declare variables 
    List<AlphaItems> alphaList = new ArrayList<>(); 
    private AddBrandPage addBrandPage; 
    private Context context; 


    //the constructor 
    public AlphaAdapter (List<AlphaItems> alphaList, Context context, AddBrandPage addBrandPage){ 
     this.alphaList = alphaList; 
     this.context = context; 
     this.addBrandPage = addBrandPage; 

    } 


    @Override 
    public AlphaAdapter.AlphaViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.alpha_items, parent, false); 
     AlphaViewHolder alphaViewHolder = new AlphaViewHolder(view,addBrandPage); 
     return alphaViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(AlphaAdapter.AlphaViewHolder holder, int position) { 
     holder.txt_alpha.setText(alphaList.get(position).getLetter()); 
    } 

    @Override 
    public int getItemCount() { 
     return alphaList.size(); 
    } 

    public class AlphaViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

     //declare variables 
     private TextView txt_alpha; 
     private AddBrandPage addBrandPage; 


     //the constructor 
     public AlphaViewHolder (View itemView, AddBrandPage addBrandPage){ 
      super(itemView); 
      this.addBrandPage = addBrandPage; 

      //initialize variables 
      txt_alpha = (TextView) itemView.findViewById(R.id.txt_alpha); 

      //set click listener 
      txt_alpha.setOnClickListener(this); 


     } 


     @Override 
     public void onClick(View v) { 
      int position = getAdapterPosition(); 
      String letter = alphaList.get(position).toString(); 
      addBrandPage.updateLogoDisplay(letter); 

     } 
    } 
} 

ist der logcat Fehler:

06-15 15:42:10.306 30577-30577/com.test.test D/AndroidRuntime: Shutting down VM 
06-15 15:42:10.307 30577-30577/com.test.test E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.test.test, PID: 30577 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.substring(int)' on a null object reference 
                    at com.test.test.AddBrandPage.updateLogoDisplay(AddBrandPage.java:253) 
                    at com.test.test.AlphaAdapter$AlphaViewHolder.onClick(AlphaAdapter.java:78) 
                    at android.view.View.performClick(View.java:5637) 
                    at android.view.View$PerformClick.run(View.java:22429) 
                    at android.os.Handler.handleCallback(Handler.java:751) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6119) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
06-15 15:46:57.570 30577-30626/com.test.test W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 
+0

Innerhalb updateLogoDisplay sind Ihre geschweiften Klammern aus; vielleicht ist dies das Problem, also bitte korrigieren Sie das Layout – Aenadon

+0

Ich habe doppelt überprüft, die geschweiften Klammern sind nicht aus. Ich glaube nicht, dass das Programm ausgeführt werden könnte, um die Null-Ausnahme zu erzeugen, wenn dies der Fall wäre. @Aenadon –

+1

Hmm, okay. Können Sie bitte Folgendes versuchen: Setzen Sie einen Haltepunkt auf 'String t = ...' und sehen Sie, ob c tatsächlich einen Wert hat, dann verwenden Sie IntelliJs "Evaluate Expression", um 'r.getName();' im Debugger auszuwerten – Aenadon

Antwort

0

Ich konnte das Problem lösen. Wenn die Iteration das Ende erreicht, wird die Variable c null. Dies erzeugt die Nullzeiger-Ausnahme. Um den Null-Fehler zu vermeiden, fügte ich if (c! = Null) vor der Zeile String t = ... hinzu.

Verwandte Themen