2012-11-17 13 views

risposta

53

Se osserviamo il seguente codice, abbiamo array di nomi e valori in getView e getDropDownView.

private void initView() { 
    SpinnerDropDownAdapter sddadapter = new SpinnerDropDownAdapter(this); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, sddadapter.name); 

    Spinner getViewSP = (Spinner) findViewById(R.id.getview_sp); 
    getViewSP.setAdapter(adapter); 

    Spinner getViewWDropDownSP = (Spinner) findViewById(R.id.getview_w_drop_down_sp); 
    getViewWDropDownSP.setAdapter(sddadapter); 
} 

static class SpinnerDropDownAdapter extends BaseAdapter implements 
     SpinnerAdapter { 
    Context context; 

    SpinnerDropDownAdapter(Context ctx) { 
     context = ctx; 
    } 

    String[] name = { " One", " Two", " Three", " Four", " Five", " Six", 
      " Seven", " Eight" }; 
    String[] value = { " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8" }; 

    @Override 
    public int getCount() { 
     return name.length; 
    } 

    @Override 
    public String getItem(int pos) { 
     // TODO Auto-generated method stub 
     return name[pos]; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView text = new TextView(context); 
     text.setTextColor(Color.BLACK); 
     text.setText(name[position]); 
     return text; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, 
      ViewGroup parent) { 
     TextView text = new TextView(context); 
     text.setTextColor(Color.BLACK); 
     text.setText(value[position]); 
     return text; 
    } 
} 

Se il metodo getDropDownView non è implementato, la finestra a comparsa mostrerà la vista da getView. Quindi, mostrerà solo il nome.

getView

Quando viene implementato sia GetView e getDropDownView, l'ex ottenendo nome e la seconda ottenendo valore, il filatore a riposo otterrà nome dal GetView e discesa pop-up avranno valore. getView and getDropDownView

+0

possiamo ottenere vista a qui come semplice filatore? – stackoverflow

+0

questo è quello che voglio, certo, grazie +1. –

42

La risposta accettata sembra un po 'complicato, quindi per semplicità

  • getView - il valore visualizzato sul filatore prima che l'utente preme il filatore, dove ogni vista valore può essere regolato con la convertView parametro

  • getDropDownView - elenco di valori l'utente può selezionare dopo l'utente preme il filatore, dove ogni valore nella lista può essere adattato con il parametro convertView

+2

Sono 'View's, non valori. 'getView()' è per il singolo 'View' che si vede prima che 'Spinner' venga toccato. 'getDropDownView()' è per la pila verticale di 'View's che vedi quando si tocca il' Spinner'. Puoi utilizzare i due metodi per creare/popolare ciascuno dei due tipi di 'View's secondo le tue esigenze. –

7

getView e getDropDownView possono mostrare layout diversi.

Creo uno Spinner e utilizzo class ImageTextAdapter extends ArrayAdapter<String> come adattatore. Eseguo l'override di getView in modo che possa mostrare sia ImageView e TextView. Tuttavia, non sovrascrivo lo getDropDownView.

Questo è uno screenshot prima che il filatore viene premuto

enter image description here

e dopo aver premuto il filatore.

enter image description here

ho inizializzare il filatore con il seguente codice.

String[] spinnerTexts = {"Tanzania", "Thailand"}; 
int[] spinnerImages = {R.drawable.tanzania, R.drawable.thailand}; 

ArrayAdapter<String> adapter = new ImageTextAdapter(this, spinnerTexts, spinnerImages); 

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
spinner.setAdapter(adapter); 

Ecco ImageTextAdapter.java

public class ImageTextAdapter extends ArrayAdapter<String> { 

    int[] images; 

    public ImageTextAdapter(Context ctx, String[] texts, int[] images) { 
     super(ctx, android.R.layout.simple_spinner_item, texts); 
     this.images = images; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = getLayoutInflater().inflate(R.layout.row, parent, false); 

     TextView textView = (TextView) row.findViewById(R.id.textView); 
     textView.setText(getItem(position)); 

     ImageView imageView = (ImageView) row.findViewById(R.id.imageView); 
     imageView.setImageResource(images[position]); 

     return row; 
    } 
} 
+0

Grazie. Migliore risposta! –

1

Possiamo usare SpinnerAdapter come questo:

public class FolderSpinnerAdpater extends BaseAdapter implements SpinnerAdapter { 
@Override 
public int getCount() { 
    return 0; 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    return null; 
} 
} 

In BaseAdapter.java

public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    return getView(position, convertView, parent); 
} 

Override getView() e getDropDownView(), ritorno diverso punto di vista, si trova la differenza.

enter image description here