Guten Abend,
Ich hätte da mal eine Frage die mich doch vor eine gewisse Verwunderung stellt...
Und zwar habe ich auf einer website (http://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:
package com.example.niklas.medienlister;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class ListViewAdapter extends BaseAdapter {
Context mContext;
LayoutInflater inflater;
private List<DVD> filmList = null;
private ArrayList<DVD> arraylist;
public ListViewAdapter(Context context, ArrayList<DVD> filmList) {
mContext = context;
this.filmList = filmList;
inflater = LayoutInflater.from(mContext);
this.arraylist = new ArrayList<DVD>();
this.arraylist.addAll(filmList);
}
public class ViewHolder {
TextView titel;
TextView jahr;
TextView zeit;
TextView fsk;
TextView server;
}
@Override
public int getCount() {
return filmList.size();
}
@Override
public DVD getItem(int position) {
return filmList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.list_view_items, null);
// Locate the TextViews in listview_item.xml
holder.titel = (TextView) view.findViewById(R.id.titel);
holder.jahr = (TextView) view.findViewById(R.id.jahr);
holder.zeit = (TextView) view.findViewById(R.id.zeit);
holder.fsk = (TextView) view.findViewById(R.id.fsk);
holder.server = (TextView) view.findViewById(R.id.server);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
// Set the results into TextViews
holder.titel.setText(filmList.get(position).getTitel());
holder.jahr.setText(filmList.get(position).getJahr());
holder.zeit.setText(filmList.get(position).getZeit() + " min");
holder.fsk.setText(filmList.get(position).getFSK());
holder.server.setText(filmList.get(position).getServer());
return view;
}
// Filter Class
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
filmList.clear();
if (charText.length() == 0) {
filmList.addAll(arraylist);
} else {
for (DVD wp : arraylist) {
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)) {
filmList.add(wp);
}
}
}
notifyDataSetChanged();
}
}
Alles anzeigen
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; }
}
Alles anzeigen
package com.example.niklas.medienlister;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SearchView;
import java.util.ArrayList;
import java.util.Arrays;
public class Suche extends AppCompatActivity implements SearchView.OnQueryTextListener {
ListView list;
ListViewAdapter adapter;
SearchView editsearch;
DVD[] filmList;
ArrayList<DVD> arraylist = new ArrayList<>(Arrays.asList(Menu.dvdv.dvds));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_suche);
getSupportActionBar().setTitle("Suche");
getSupportActionBar().setTitle("Bearbeiten");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
// Locate the ListView in listview_main.xml
list = (ListView) findViewById(R.id.listview);
filmList = Menu.dvdv.dvds;
// Pass results to ListViewAdapter Class
adapter = new ListViewAdapter(this, arraylist);
// Binds the Adapter to the ListView
list.setAdapter(adapter);
// Locate the EditText in listview_main.xml
editsearch = (SearchView) findViewById(R.id.search);
editsearch.setOnQueryTextListener(this);
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
String text = newText;
adapter.filter(text);
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if(id == android.R.id.home){
Intent menu = new Intent(this, Menu.class);
startActivity(menu);
this.finish();
}
return super.onOptionsItemSelected(item);
}
}
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:
for (DVD wp : arraylist) {
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)) {
filmList.add(wp);
}
Suche Z. 60:
public boolean onQueryTextChange(String newText) {
String text = newText;
adapter.filter(text);
return false;
}
Alles anzeigen
Habt ihr eine Idee was daran nun falsch sein kann?Ich bin für jede Hilfe dankbar!
LG.Greg