package gueei.binding.viewAttributes.adapterView.listView;
import gueei.binding.Binder;
import gueei.binding.BindingType;
import gueei.binding.IObservable;
import gueei.binding.Observer;
import gueei.binding.ViewAttribute;
import gueei.binding.exception.AttributeNotDefinedException;
import gueei.binding.viewAttributes.templates.Layout;
import java.util.Collection;
import android.widget.Adapter;
import android.widget.Filter;
import android.widget.ListView;
/**
* Item Source of ListView
* Supplying the IObservableCollection to this and Item Template together, adapter will be created automatically
* Due to the complexity of this API, we recommend to switch to binding:adapter instead of this
* e.g. binding:adapter="ADAPTER({source=..., template=...})
* which will give more fine-grain control on adapter generated
*
* @name itemSource
* @widget ListView
* @type Object
* @accepts Object
* @category list
* @related
*
* @author andy
*/
public class ItemSourceViewAttribute extends ViewAttribute<ListView, Object> {
Layout template, spinnerTemplate;
Filter filter;
ViewAttribute<?,Layout> itemTemplateAttr, spinnerTemplateAttr;
ViewAttribute<?,Filter> filterAttr;
Object mValue;
private Observer templateObserver = new Observer(){
public void onPropertyChanged(IObservable<?> prop,
Collection<Object> initiators) {
template = itemTemplateAttr.get();
spinnerTemplate = spinnerTemplateAttr.get();
doSetAttributeValue(mValue);
}
};
@SuppressWarnings("unchecked")
public ItemSourceViewAttribute(ListView view, String attributeName) {
super(Object.class,view, attributeName);
try{
itemTemplateAttr = (ViewAttribute<?,Layout>)Binder.getAttributeForView(getView(), "itemTemplate");
itemTemplateAttr.subscribe(templateObserver);
spinnerTemplateAttr = (ViewAttribute<?,Layout>)Binder.getAttributeForView(getView(), "spinnerTemplate");
spinnerTemplateAttr.subscribe(templateObserver);
template = itemTemplateAttr.get();
spinnerTemplate = spinnerTemplateAttr.get();
filterAttr = (ViewAttribute<?,Filter>)Binder.getAttributeForView(getView(), "filter");
filter = filterAttr.get();
}catch(Exception e){
e.printStackTrace();
return;
}
}
@Override
@SuppressWarnings("unchecked")
protected void doSetAttributeValue(Object newValue) {
if(getView()==null) return;
mValue = newValue;
if (newValue == null)
return;
if (newValue instanceof Adapter){
try {
((ViewAttribute<?, Adapter>)Binder.getAttributeForView(getView(), "adapter")).set((Adapter)newValue);
} catch (AttributeNotDefinedException e) {
e.printStackTrace();
}
return;
}
if (template==null) return;
spinnerTemplate = spinnerTemplate == null ? template : spinnerTemplate;
try {
Adapter adapter = gueei.binding.collections.Utility.getSimpleAdapter
(getView().getContext(), newValue, spinnerTemplate, template, filter);
((ViewAttribute<?, Adapter>)Binder.getAttributeForView(getView(), "adapter")).set(adapter);
ViewAttribute<?,Integer> SelectedPosition = (ViewAttribute<?,Integer>)Binder.getAttributeForView(getView(), "selectedPosition");
getView().setSelection(SelectedPosition.get());
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
}
@Override
public Object get() {
return mValue;
}
@Override
protected BindingType AcceptThisTypeAs(Class<?> type) {
return BindingType.OneWay;
}
}