I'm Using a spinner to show some data from my database, in main activity I set my custom adapter to the spinner
PazienteSpinnerAdapter pazienteAdapter = new PazienteSpinnerAdapter(this,mDb.getAllPazienti());
spn_nome.setAdapter(pazienteAdapter);
This is the class of my custom adapter
public class PazienteSpinnerAdapter extends ArrayAdapter<Paziente_DA> {
private final Context context;
private final ArrayList<Paziente_DA> pazienti;
private ArrayList<Paziente_DA> suggestions;
public PazienteSpinnerAdapter(Context context, ArrayList<Paziente_DA> values) {
super(context, R.layout.item_pazienti_small, values);
this.context = context;
this.pazienti = values;
this.suggestions = new ArrayList<Paziente_DA>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Paziente_DA paziente = pazienti.get(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.item_pazienti_small, parent, false);
TextView txt_nome = (TextView) rowView.findViewById(R.id.txt_item_pazienti_nome);
TextView txt_data = (TextView) rowView.findViewById(R.id.txt_item_pazienti_data);
txt_nome.setText(paziente.getNome());
final Time data = new Time();
data.set(paziente.getData_nasciata());
txt_data.setText(data.format("%d/%m/%Y"));
return rowView;
}
@Override
public Filter getFilter() {
return nameFilter;
}
Filter nameFilter = new Filter() {
public String convertResultToString(Object resultValue) {
Paziente_DA paziente = (Paziente_DA) (resultValue);
final Time data = new Time();
return paziente.getNome();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (Paziente_DA paziente : pazienti) {
if (paziente.getNome().toLowerCase().startsWith(constraint.toString().toLowerCase())) {
suggestions.add(paziente);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<Paziente_DA> filteredList = (ArrayList<Paziente_DA>) results.values;
if (results != null && results.count > 0) {
clear();
for (Paziente_DA c : filteredList) {
add(c);
}
notifyDataSetChanged();
}
}
};
}
this is the layout of the adapter
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="New Text"
android:textSize="20sp"
android:padding="3dp"
android:textColor="@android:color/black"
android:id="@+id/txt_item_pazienti_nome" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="New Text"
android:textSize="20sp"
android:padding="3dp"
android:textColor="@android:color/black"
android:id="@+id/txt_item_pazienti_data" />
</LinearLayout>
When I click on the spinner, and the list must be shown i got this error "java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView"
I search on internet and also here on Stack, but nobody use a custom adapter.
this is the log
java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:415)
at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:853)
at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:849)
at android.widget.Spinner.measureContentWidth(Spinner.java:734)
at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1081)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1107)
at android.widget.Spinner.performClick(Spinner.java:658)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:415)
at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:853)
at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:849)
at android.widget.Spinner.measureContentWidth(Spinner.java:734)
at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1081)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1107)
at android.widget.Spinner.performClick(Spinner.java:658)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)