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.
Innerhalb updateLogoDisplay sind Ihre geschweiften Klammern aus; vielleicht ist dies das Problem, also bitte korrigieren Sie das Layout – Aenadon
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 –
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