Search View -> NullPointerException

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Search View -> NullPointerException

    Guten Abend,
    Ich hätte da mal eine Frage die mich doch vor eine gewisse Verwunderung stellt...
    Und zwar habe ich auf einer website (abhiandroid.com/ui/searchview) eine schöne Anleitung für so eine Fragmentsuche gefunden.
    Probiert, funktioniert.
    Nun habe ich das mal für meine Wünsche umgeschrieben:

    Java-Quellcode: ListViewAdapter

    1. package com.example.niklas.medienlister;
    2. import android.content.Context;
    3. import android.view.LayoutInflater;
    4. import android.view.View;
    5. import android.view.ViewGroup;
    6. import android.widget.BaseAdapter;
    7. import android.widget.TextView;
    8. import java.util.ArrayList;
    9. import java.util.List;
    10. import java.util.Locale;
    11. public class ListViewAdapter extends BaseAdapter {
    12. Context mContext;
    13. LayoutInflater inflater;
    14. private List<DVD> filmList = null;
    15. private ArrayList<DVD> arraylist;
    16. public ListViewAdapter(Context context, ArrayList<DVD> filmList) {
    17. mContext = context;
    18. this.filmList = filmList;
    19. inflater = LayoutInflater.from(mContext);
    20. this.arraylist = new ArrayList<DVD>();
    21. this.arraylist.addAll(filmList);
    22. }
    23. public class ViewHolder {
    24. TextView titel;
    25. TextView jahr;
    26. TextView zeit;
    27. TextView fsk;
    28. TextView server;
    29. }
    30. @Override
    31. public int getCount() {
    32. return filmList.size();
    33. }
    34. @Override
    35. public DVD getItem(int position) {
    36. return filmList.get(position);
    37. }
    38. @Override
    39. public long getItemId(int position) {
    40. return position;
    41. }
    42. public View getView(final int position, View view, ViewGroup parent) {
    43. final ViewHolder holder;
    44. if (view == null) {
    45. holder = new ViewHolder();
    46. view = inflater.inflate(R.layout.list_view_items, null);
    47. // Locate the TextViews in listview_item.xml
    48. holder.titel = (TextView) view.findViewById(R.id.titel);
    49. holder.jahr = (TextView) view.findViewById(R.id.jahr);
    50. holder.zeit = (TextView) view.findViewById(R.id.zeit);
    51. holder.fsk = (TextView) view.findViewById(R.id.fsk);
    52. holder.server = (TextView) view.findViewById(R.id.server);
    53. view.setTag(holder);
    54. } else {
    55. holder = (ViewHolder) view.getTag();
    56. }
    57. // Set the results into TextViews
    58. holder.titel.setText(filmList.get(position).getTitel());
    59. holder.jahr.setText(filmList.get(position).getJahr());
    60. holder.zeit.setText(filmList.get(position).getZeit() + " min");
    61. holder.fsk.setText(filmList.get(position).getFSK());
    62. holder.server.setText(filmList.get(position).getServer());
    63. return view;
    64. }
    65. // Filter Class
    66. public void filter(String charText) {
    67. charText = charText.toLowerCase(Locale.getDefault());
    68. filmList.clear();
    69. if (charText.length() == 0) {
    70. filmList.addAll(arraylist);
    71. } else {
    72. for (DVD wp : arraylist) {
    73. if (wp.getTitel().toLowerCase(Locale.getDefault()).contains(charText) || wp.getJahr().toLowerCase(Locale.getDefault()).contains(charText) || wp.getZeit().toLowerCase(Locale.getDefault()).contains(charText) || wp.getFSK().toLowerCase(Locale.getDefault()).contains(charText) || wp.getServer().toLowerCase(Locale.getDefault()).contains(charText)) {
    74. filmList.add(wp);
    75. }
    76. }
    77. }
    78. notifyDataSetChanged();
    79. }
    80. }
    Alles anzeigen








    Java-Quellcode: DVD

    1. package com.example.niklas.medienlister;
    2. public class DVD {
    3. public String titel;
    4. public String erscheinungsjahr;
    5. public String laufzeit;
    6. public String fsk;
    7. public String server;
    8. public DVD(String titel, String erscheinungsjahr, String laufzeit, String fsk, String server) {
    9. this.titel = titel;
    10. this.erscheinungsjahr = erscheinungsjahr;
    11. this.laufzeit = laufzeit;
    12. this.fsk = fsk;
    13. this.server = server;
    14. }
    15. public String getTitel() {
    16. return this.titel;
    17. }
    18. public String getJahr() {
    19. return this.erscheinungsjahr;
    20. }
    21. public String getZeit() {
    22. return this.laufzeit;
    23. }
    24. public String getFSK() { return this.fsk; }
    25. public String getServer() { return this.server; }
    26. }
    Alles anzeigen



    Java-Quellcode: Suche

    1. package com.example.niklas.medienlister;
    2. import android.content.Intent;
    3. import android.support.v7.app.AppCompatActivity;
    4. import android.os.Bundle;
    5. import android.view.MenuItem;
    6. import android.widget.ListView;
    7. import android.widget.SearchView;
    8. import java.util.ArrayList;
    9. import java.util.Arrays;
    10. public class Suche extends AppCompatActivity implements SearchView.OnQueryTextListener {
    11. ListView list;
    12. ListViewAdapter adapter;
    13. SearchView editsearch;
    14. DVD[] filmList;
    15. ArrayList<DVD> arraylist = new ArrayList<>(Arrays.asList(Menu.dvdv.dvds));
    16. @Override
    17. protected void onCreate(Bundle savedInstanceState) {
    18. super.onCreate(savedInstanceState);
    19. setContentView(R.layout.activity_suche);
    20. getSupportActionBar().setTitle("Suche");
    21. getSupportActionBar().setTitle("Bearbeiten");
    22. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    23. getSupportActionBar().setDisplayShowHomeEnabled(true);
    24. // Locate the ListView in listview_main.xml
    25. list = (ListView) findViewById(R.id.listview);
    26. filmList = Menu.dvdv.dvds;
    27. // Pass results to ListViewAdapter Class
    28. adapter = new ListViewAdapter(this, arraylist);
    29. // Binds the Adapter to the ListView
    30. list.setAdapter(adapter);
    31. // Locate the EditText in listview_main.xml
    32. editsearch = (SearchView) findViewById(R.id.search);
    33. editsearch.setOnQueryTextListener(this);
    34. }
    35. @Override
    36. public boolean onQueryTextSubmit(String query) {
    37. return false;
    38. }
    39. @Override
    40. public boolean onQueryTextChange(String newText) {
    41. String text = newText;
    42. adapter.filter(text);
    43. return false;
    44. }
    45. @Override
    46. public boolean onOptionsItemSelected(MenuItem item){
    47. int id = item.getItemId();
    48. if(id == android.R.id.home){
    49. Intent menu = new Intent(this, Menu.class);
    50. startActivity(menu);
    51. this.finish();
    52. }
    53. return super.onOptionsItemSelected(item);
    54. }
    55. }
    Alles anzeigen

    Der XML Code ist für die Main (in meinem fall Tabelle) gleich geblieben. Die list_view_items hab ich dahingehend verändert dass es nun 5 textviews sind (titel, erscheinungsjahr, laufzeit, fsk, server)


    Im Grunde das gleiche wie auch auf der Website... wenn ich das ganze nun starte sind alle filme zu sehen.
    Gebe ich nun etwas in die Suchleiste ein (buchstaben werden nicht angezeigt) hängt sich die app auf und stürtzt mit der Meldung:

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.niklas.medienlister, PID: 26091
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.niklas.medienlister.DVD.getTitel()' on a null object reference
    at com.example.niklas.medienlister.ListViewAdapter.filter(ListViewAdapter.java:91)
    at com.example.niklas.medienlister.Suche.onQueryTextChange(Suche.java:60)
    at android.widget.SearchView.onTextChanged(SearchView.java:1349)
    at android.widget.SearchView.-wrap9(SearchView.java)
    at android.widget.SearchView$9.onTextChanged(SearchView.java:1937)
    at android.widget.TextView.sendOnTextChanged(TextView.java:9404)
    at android.widget.TextView.handleTextChanged(TextView.java:9481)
    at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:12320)
    at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1208)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:578)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:509)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:508)
    at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:850)
    at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:200)
    at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:345)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:91)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6692)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

    ab... Ich verstehe ja an sich was mir die app sagen will... aber wenn das null wäre würde ich doch keine Liste angezeigt bekommen oder?



    ListViewAdapter Z. 91:

    Java-Quellcode

    1. for (DVD wp : arraylist) {
    2. if (wp.getTitel().toLowerCase(Locale.getDefault()).contains(charText) || wp.getJahr().toLowerCase(Locale.getDefault()).contains(charText) || wp.getZeit().toLowerCase(Locale.getDefault()).contains(charText) || wp.getFSK().toLowerCase(Locale.getDefault()).contains(charText) || wp.getServer().toLowerCase(Locale.getDefault()).contains(charText)) {
    3. filmList.add(wp);
    4. }

    Suche Z. 60:

    Quellcode

    1. public boolean onQueryTextChange(String newText) {
    2. String text = newText;
    3. adapter.filter(text);
    4. return false;
    5. }


    Habt ihr eine Idee was daran nun falsch sein kann?Ich bin für jede Hilfe dankbar!
    LG.Greg

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Greg50007 ()

  • Lösung gefunden!

    Java-Quellcode

    1. package com.example.niklas.medienlister;
    2. import android.content.Intent;
    3. import android.support.v7.app.AppCompatActivity;
    4. import android.os.Bundle;
    5. import android.view.MenuItem;
    6. import android.widget.ListView;
    7. import android.widget.SearchView;
    8. import java.util.ArrayList;
    9. import java.util.Comparator;
    10. public class Suche extends AppCompatActivity implements SearchView.OnQueryTextListener {
    11. ListView list;
    12. ListViewAdapter adapter;
    13. SearchView editsearch;
    14. ArrayList<DVD> arraylist = new ArrayList<DVD>();
    15. @Override
    16. protected void onCreate(Bundle savedInstanceState) {
    17. super.onCreate(savedInstanceState);
    18. setContentView(R.layout.activity_suche);
    19. getSupportActionBar().setTitle("Suche");
    20. getSupportActionBar().setTitle("Bearbeiten");
    21. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    22. getSupportActionBar().setDisplayShowHomeEnabled(true);
    23. // Locate the ListView in listview_main.xml
    24. list = (ListView) findViewById(R.id.listview);
    25. for(int i = 0; i < Menu.dvdv.counter; i++) {//ergänzt
    26. arraylist.add(Menu.dvdv.dvds[i]);//ergänzt
    27. }//ergänzt
    28. // Pass results to ListViewAdapter Class
    29. adapter = new ListViewAdapter(this, arraylist);
    30. // Binds the Adapter to the ListView
    31. list.setAdapter(adapter);
    32. // Locate the EditText in listview_main.xml
    33. editsearch = (SearchView) findViewById(R.id.search);
    34. editsearch.setOnQueryTextListener(this);
    35. }
    36. @Override
    37. public boolean onQueryTextSubmit(String query) {
    38. return false;
    39. }
    40. @Override
    41. public boolean onQueryTextChange(String newText) {
    42. String text = newText;
    43. adapter.filter(text);
    44. return false;
    45. }
    46. @Override
    47. public boolean onOptionsItemSelected(MenuItem item){
    48. int id = item.getItemId();
    49. if(id == android.R.id.home){
    50. Intent menu = new Intent(this, Menu.class);
    51. startActivity(menu);
    52. this.finish();
    53. }
    54. return super.onOptionsItemSelected(item);
    55. }
    56. }
    Alles anzeigen
  • Toll ist das du es selber gefunden hast. :) nur wären ein paar Zeilen zur Erklärung, vor allen für die Anfänger nicht schlecht gewesen. Was falsch war und warum Du die nullpionterexeption bekommen hast, nicht schlecht gewesen. Ist aber trotzdem sehr lobnenswert das du uns die Lösung mitteilst.

    Allso klar ist das Mann im Klassenrunpf Variablen nich werte zuweisen kann. Außer primitiven Variablen wie "int". Das ist halt in Java oder auch anderen oop sprachen so. Arraylist ist selbst eine Klasse und ihr sollte nur in einer Methode werte zugewiesen ( Initialisiert) werden.
    Im Klassenrunpf sollten nur (Deklarationen) von Variablen die dann globale in der Klasse sind stehen. Arber keine Initialisierung dafür ist der Konstrucktor da,
    das ist eigentlich Objekt orientierte Programmierung Grundwissen.
    Ein Feedback auf Tipps ist auch schön. :P
  • Die Erklärung ist tatsächlich sehr simple...

    Und zwar hab ich vergessen die arraylist mit den Werten des arrays zu füllen._.

    Das war tatsächlich das ganze Problem...

    Aber vielleicht könnt ihr mir ja jetzt doch nochmal weiter helfen.

    Derzeit sortiere ich meinen DVD [ ] mit einem Bubble sort... das ist aber ziemlich Zeitaufwendig bei 4000 stellen...

    Mit arrays.sort geht es ja auch nicht, da ich den array ja nach dem ersten String der DVD objekte sortieren will...
    meine Frage nun: eine schnelle und einfache Methode um einen Objekt array zu sortieren?!

    Lg.
    Greg
  • wie ist den deine strahlst aufgebaut meine vor allen die klasse DVD.
    Denke es würde mehr Sinn machen die Daten in einer sqlite Datenbank zu speichern. Da kannst du ach beim auslesen gleich deine Daten sortieren . Suchen Daten hinzufügen ändern usw ist damit einfacher.

    Sortieren einer einfachen Liste javatricks.de/tricks/arraylist-sortieren
    Ein Feedback auf Tipps ist auch schön. :P
  • Hi,
    Erstmal danke für die Antwort :)
    Die Sache ist, ich kann ja auch Arrays.sort machen... das ist doch das gleiche wie Collection.sort

    Das Problem ist das es sich ja um keinen String array handelt, sondern einen Objekt array DVD

    Java-Quellcode

    1. package com.example.niklas.medienlister;public class DVD { public String titel; public String erscheinungsjahr; public String laufzeit; public String fsk; public String server; public DVD(String titel, String erscheinungsjahr, String laufzeit, String fsk, String server) { this.titel = titel; this.erscheinungsjahr = erscheinungsjahr; this.laufzeit = laufzeit; this.fsk = fsk; this.server = server; } public String getTitel() { return this.titel; } public String getJahr() { return this.erscheinungsjahr; } public String getZeit() { return this.laufzeit; } public String getFSK() { return this.fsk; } public String getServer() { return this.server; }}
    Und soetiert werden soll nach dem ersten Parameter Titel. Weißt du was ich meine?
    LG
    Greg