2013-09-02 12 views
9

Otrzymuję dane z bazy danych SQLite i przypisuję je do obiektów danych. Używam niestandardowego adaptera spinner (implementuje SpinnerAdapter), aby umieścić je w spinnerach, aby zastąpić metody getItem() i getItemId(). Jednak android.R.layout.simple_spinner_dropdown_item nie wyświetla prawidłowo (zrzuty ekranu z mojego Galaxy Tab 2 10.1):Niestandardowe wyświetlanie niestandardowego adaptera spinningu simple_spinner_dropdown

Wrong spinner from data object

Natomiast to spinner, który jest wypełniana od tablicy w R.array (prawidłowego wyglądu/wielkości):

Proper spinner from R.array

Sporządzono przez ten kod:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.quote_prices, android.R.layout.simple_spinner_item); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
spinner.setAdapter(adapter); 

Nie jestem w stanie uzyskać tego wyglądu poprzez implementację/rozszerzenie jakiegoś adaptera (próbowałem również rozszerzyć BaseAdapter bez rezultatu). To jest kod dla adaptera spinner w stanie:

public class MySpinnerAdapter implements SpinnerAdapter { 

    private Context context; 
    /** 
    * The internal data (the ArrayList with the Objects). 
    */ 
    private List<? extends BaseDO> data; 

    public MySpinnerAdapter(Context context, List<?extends BaseDO> data){ 
     this.context = context; 
     this.data = data; 
    } 

    /** 
    * Returns the Size of the ArrayList 
    */ 
    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return data.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return data.get(position).getId(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return 0; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null); 
     } 
     ((TextView) convertView).setText(data.get(position).toString()); 
     return convertView; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_item, null); 
     textView.setText(data.get(position).toString()); 
     return textView; 
    } 


    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 

    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 

    } 

    public List<? extends BaseDO> getData() { 
     return data; 
    } 

} 

Każda pomoc zostanie doceniona.

EDIT: Zapomniałem wspomnieć, że nazywa się to za pomocą

spnnrTerm.setAdapter(new MySpinnerAdapter(getActivity(), termList)); 

Odpowiedz

14

Wiem, że to pytanie jest stary, ale ja już zostały posiadające ten sam problem i nie tylko zorientowali się problem. Po zbadaniu źródła dla ArrayAdapter.java zauważyłem, że przechodziło ViewGroup do nadmuchiwacza, a ja nie byłem. To był cały czas problem.

@Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false); 
     } 
     ((TextView) convertView).setText(data.get(position).toString()); 
     return convertView; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_item, null); 
     textView.setText(data.get(position).toString()); 
     return textView; 
    } 
+0

Interesujące, będę musiał wykopać aplikację skądś ... Wrócę do ciebie. – Rob

+1

Mam go do pracy, dobre miejsce w źródle. Redagowałem kod nieco, ponieważ funkcja 'inflate()' w metodzie 'getView()' nie istnieje, tak jak to określiłeś. W rzeczywistości dało mi to błędy, gdy podawałem rodzicowi tę funkcję, więc ostatecznie wszystko, co było konieczne, to zmiana pierwszego 'nadmuchania()'. – Rob

Powiązane problemy