In order to understand the trick, one has to know, how Adapters work in general and ArrayAdapter in particular. 
Adapters: are objects that are able to bind data structures to widgets, then these widgets are displaying that data in a List or in a Spinner. 
So the two questions an Adapter answers are:
- Which widget or composite view needs to be associated with a data structure(your class' object) for a certain index?
- How to extract the data from the data structure(your class' object) and how to set field(s) i.e EditTextof the widget or composite view according to this data?
ArrayAdapter's answers are:
- Each widget (i.e row.xmlORandroid.R.layout.simple_spinner_item) for any index is the same, and is inflated from the resource whose ID was given to ArrayAdapter's constructor.
- Each widget is expected to be an instance of TextView (or
descendant). The widget's .setText()method will be used with the
string format of the item in the supporting data structure. The
string format will be obtained by invoking.toString()on the item.
CustomListViewDemo.java
public class CustomListViewDemo extends ListActivity {
  private EfficientAdapter adap;
  private static String[] data = new String[] { "0", "1", "2", "3", "4" };
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    adap = new EfficientAdapter(this);
    setListAdapter(adap);
  }
  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show();
  }
  public static class EfficientAdapter extends BaseAdapter implements Filterable {
    private LayoutInflater mInflater;
    private Bitmap mIcon1;
    private Context context;
    int firstpos=0;
    public EfficientAdapter(Context context) {
      // Cache the LayoutInflate to avoid asking for a new one each time.
      mInflater = LayoutInflater.from(context);
      this.context = context;
    }
    public View getView(final int position, View convertView, ViewGroup parent) {
      ViewHolder holder;
      if (convertView == null) {
        convertView = mInflater.inflate(R.layout.adaptor_content, null);
        holder = new ViewHolder();
        holder.sp = (Spinner) convertView.findViewById(R.id.spinner1);
        holder.ArrayAdapter_sp = new ArrayAdapter(parent.getContext(),android.R.layout.simple_spinner_item,data);
        holder.ArrayAdapter_sp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.sp.setAdapter( holder.ArrayAdapter_sp);
        holder.sp.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            private int pos = position;
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int p, long arg3) 
            {
                // TODO Auto-generated method stub
                 Toast.makeText(context, "select spinner " + String.valueOf(pos)+" with value ID "+p, Toast.LENGTH_SHORT).show();    
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {
                // TODO Auto-generated method stub
            }
        });
        convertView.setTag(holder);
      } else {
        holder = (ViewHolder) convertView.getTag();
      }
      return convertView;
    }
    static class ViewHolder 
    {
        Spinner sp;
        ArrayAdapter ArrayAdapter_sp;
    }
    @Override
    public Filter getFilter() {
      // TODO Auto-generated method stub
      return null;
    }
    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      return 0;
    }
    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return data.length;
    }
    @Override
    public Object getItem(int position) {
      // TODO Auto-generated method stub
      return data[position];
    }
  }
}
adaptor_content.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lineItem"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical" >
    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="314dp"
        android:layout_height="wrap_content" />
</LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent" android:layout_width="fill_parent"
    >
    <ListView
        android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="60dip"
        android:layout_marginTop="10dip"
        android:cacheColorHint="#00000000"
        android:drawSelectorOnTop="false" />
</RelativeLayout>
It works properly, I hope it is useful.