I think it doesn’t matter which data provider you pass to the CListView. They are all implemented from the same IDataProvider interface.
All components which use a data provider call the same data provider methods defined in the interface. Cause each data provider is different also the implementation of these methods are different but the result is always the same.
The docs say CActiveDataProvider is preferred, but you can use any dataprovider I think, like kokomo said. You would probably need to show some code for a more detailed answer, but if you are using a custum SQL string, you might consider the CSqlDataProvider. That uses a regular SQL statement so it probably works for most very custom cases. I haven’t used CSqlDataProvider myself yet, so you will need to figure out how suitable it is for yourself.
Alternatively, it might be that your code is easily refactorable to use CActiveDataprovider. By the way, the CActiveDataProdiver uses ActiveRecord to query the database. So again, maybe some code might help you get a more detailed answer.
I’m not sure how helpful this answer was, my thoughts don’t translate to words too well at the moment it seems, but I hope you have some points to go on.
I tried to pass the CActiveRecord Object to CListView:
$dataProvider = Product::model()->with(array(
))->findAll(array('group'=>'family.family_id')); // I checked and this query is working fine
Check CDbCriteria for details, as I am not 100% sure I correctly implemented it, but it should be close enough for the general idea.
Also note that rather than pre-fetching the query results (as you attempt to do now), CListView will call the findAll() method for you, supplying it dataprovider. You won’t need to use the getData() call yourself, as it is being done for you.