Why does my custom counter populate my package name?

I found this workaround for adding tooltips to a dropdown counter. It looked promising, but instead of showing my search strings in a spinner, I get what looks like the name of my package (I can't see the full name).
enter image description here

@IsaacCisneros created the new SpinnerItem and MySpinnerAdapter classes. I definitely implemented its new classes. My implementation is as follows:

ArrayList<SpinnerItem> credValues = new ArrayList<SpinnerItem>(); credValues.add(new SpinnerItem("3.0",false)); credValues.add(new SpinnerItem("Credit", true)); MySpinnerAdapter adapter_cred = new MySpinnerAdapter(this.getActivity(), android.R.layout.simple_spinner_item, credValues); adapter_cred.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); Spinner spinCred = (Spinner)rootView.findViewById(R.id.cred_spinner); spinCred.setAdapter(adapter_cred); spinCred.setSelection(credValues.size() - 1); 

And it looks like this:

 ArrayList<SpinnerItem> items = new ArrayList<SpinnerItem>(); items.add(new SpinnerItem("Item 1", false)); items.add(new SpinnerItem("Item 2", false)); items.add(new SpinnerItem("HINT", true)); // Last item MySpinnerAdapter adapter = new MySpinnerAdapter(this, android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(items.size() - 1); 

So why is my behavior weird? The context for my code is the onCreateView of my AddItemFragment in my activity. What am I saying wrong? Thank you


EDIT: adapter class code requested ...

 class SpinnerItem { private final String text; private final boolean isHint; public SpinnerItem(String strItem, boolean flag) { this.isHint = flag; this.text = strItem; } public String getItemString() { return text; } public boolean isHint() { return isHint; } } class MySpinnerAdapter extends ArrayAdapter<SpinnerItem> { public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) { super(context, resource, objects); } @Override public int getCount() { return super.getCount() - 1; // This makes the trick: do not show last item } @Override public SpinnerItem getItem(int position) { return super.getItem(position); } @Override public long getItemId(int position) { return super.getItemId(position); } } 
+6
source share
3 answers

The reason is that you did not redefine the getView() method of the adapter. Because of this, it uses the default implementation, which looks like this:

 T item = getItem(position); if (item instanceof CharSequence) { text.setText((CharSequence)item); } else { text.setText(item.toString()); } 

In your SpinnerItem you do not have a toString() method, so it uses the default value (which you see as the package name)

One way to fix this would be to add the toString() method to your SpinnerItem :

 class SpinnerItem { private final String text; private final boolean isHint; public SpinnerItem(String strItem, boolean flag) { this.isHint = flag; this.text = strItem; } public String getItemString() { return text; } public boolean isHint() { return isHint; } @Override public String toString() { return text; } } 

If you need more control, like color for tooltip text, etc. I recommend you implement the getView() method yourself.

+6
source

Your adapter probably extends android.widget.ArrayAdapter. By default, in the implementation of the ArrayAdapter - in the Android source code, as Amul Hare said, the getView method gets the value of the text view through

 T item = getItem(position); if (item instanceof CharSequence) { text.setText((CharSequence)item); } else { text.setText(item.toString()); } 

By default, every class that inherits from the Object class, like your SpinneItem class, returns a package name through the toString method. so you can override toString from SpinnerItem or override getView from MySpinnerAdapter.

+4
source

In your adapter add them to the constructor

 private Context mContext; private int layoutId; private List<SpinnerItem> dataList; public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) { super(context, resource, objects); this.mContext = context; this.layoutId = resource; this.dataList = objects; } 

you need to set the data in Spinner using getDropDownView() and getView() does not need to implement getCount() , getItem() and getItemId() , because a super constructor call is created in the ArrayAdapter line.

 @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder; if(convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(layoutId, null); viewHolder = new ViewHolder(); viewHolder.itemNameTxtView = (TextView) convertView.findViewById(R.id.ur_txtview_id); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String itemName = ""; SpinnerItem spinnerItem = (SpinnerItem) dataList.get(position); itemName = spinnerItem.getItemString(); viewHolder.itemNameTxtView.setText(itemName); return convertView; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder; if(convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(layoutId, null); viewHolder = new ViewHolder(); viewHolder.itemNameTxtView = (TextView) convertView.findViewById(R.id.ur_txtview_id); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String itemName = ""; SpinnerItem spinnerItem = (SpinnerItem) dataList.get(position); itemName = spinnerItem.getItemString(); viewHolder.itemNameTxtView.setText(itemName); return convertView; } private class ViewHolder { TextView itemNameTxtView; } 
+4
source

All Articles