2012-11-17 16 views

Trả lời

53

Nếu chúng ta xem mã sau, chúng ta có mảng tên và giá trị trong getView và 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; 
    } 
} 

Nếu phương thức getDropDownView không được triển khai, cửa sổ thả xuống sẽ hiển thị khung nhìn từ getView. Do đó, nó sẽ chỉ hiển thị tên.

getView

Khi cả hai getView và getDropDownView được thực hiện, cựu nhận tên và sau này bị giá trị, spinner ở phần còn lại sẽ nhận được tên từ getview và thả xuống bật lên sẽ nhận được giá trị. getView and getDropDownView

+0

chúng ta có thể xem tại đây giống như máy quay đơn giản không? – stackoverflow

+0

thats những gì tôi muốn, chắc chắn cảm ơn +1. –

42

Câu trả lời được chấp nhận có vẻ hơi phức tạp, vì vậy vì đơn giản

  • getView - giá trị được hiển thị trên spinner trước khi người dùng nhấn spinner, nơi từng xem giá trị có thể được điều chỉnh với các convertView tham số

  • getDropDownView - danh sách giá trị mà người dùng có thể chọn sau khi người dùng nhấn spinner, trong đó mỗi giá trị trong danh sách có thể được điều chỉnh theo thông số convertView

+2

Chúng là 'Chế độ xem', không phải giá trị. 'getView()' là cho 'Chế độ xem' duy nhất mà bạn thấy trước khi' Spinner' được khai thác. 'getDropDownView()' là cho chồng đứng của 'View' mà bạn thấy khi 'Spinner' được khai thác. Bạn có thể sử dụng hai phương thức để tạo/điền vào từng loại của 'Loại' theo yêu cầu của bạn. –

7

getViewgetDropDownView có thể hiển thị bố cục khác.

Tôi tạo Spinner và sử dụng class ImageTextAdapter extends ArrayAdapter<String> làm bộ điều hợp. Tôi ghi đè getView để nó có thể hiển thị cả ImageViewTextView. Tuy nhiên, tôi không ghi đè getDropDownView.

Đây là một ảnh chụp màn hình trước khi spinner được nhấn

enter image description here

và sau khi spinner được nhấn.

enter image description here

Tôi khởi tạo trình quay với mã sau đây.

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); 

Đây là 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

Cảm ơn. Câu trả lời hay nhất! –

1

Chúng ta có thể sử dụng SpinnerAdapter như thế này:

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; 
} 
} 

Trong BaseAdapter.java

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

Override getView()getDropDownView(), trở về điểm khác nhau, bạn sẽ thấy sự khác biệt.

enter image description here

Các vấn đề liên quan