package fr.ydelouis.selfoss.view; import android.content.Context; import android.content.res.TypedArray; import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ListView; import fr.ydelouis.selfoss.R; import fr.ydelouis.selfoss.adapter.PagedAdapter; public class PagedAdapterViewWrapper extends FrameLayout implements View.OnClickListener { private static final String TAG = PagedAdapterViewWrapper.class.getSimpleName(); private PagedAdapter adapter; private int adapterViewId; private AbsListView adapterView; private View loadingView; private View errorView; private View endView; private View emptyView; private View emptyErrorView; private boolean reloadOnClickOnError = true; public PagedAdapterViewWrapper(Context context) { super(context); } public PagedAdapterViewWrapper(Context context, AttributeSet attrs) { super(context, attrs); findViews(attrs); } public PagedAdapterViewWrapper(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); findViews(attrs); } private void findViews(AttributeSet attrs) { TypedArray tAttrs = getContext().obtainStyledAttributes(attrs, R.styleable.PagedAdapterViewWrapper); adapterViewId = tAttrs.getResourceId(R.styleable.PagedAdapterViewWrapper_adapterViewId, -1); setLoadingView(inflate(tAttrs, R.styleable.PagedAdapterViewWrapper_loadingView)); setErrorView(inflate(tAttrs, R.styleable.PagedAdapterViewWrapper_errorView)); setEndView(inflate(tAttrs, R.styleable.PagedAdapterViewWrapper_endView)); setEmptyView(inflate(tAttrs, R.styleable.PagedAdapterViewWrapper_emptyView)); setEmptyErrorView(inflate(tAttrs, R.styleable.PagedAdapterViewWrapper_emptyErrorView)); tAttrs.recycle(); } private View inflate(TypedArray tAttrs, int attrId) { int layoutId = tAttrs.getResourceId(attrId, -1); if(layoutId == -1) return null; return View.inflate(getContext(), layoutId, null); } public void setAdapter(PagedAdapter pagedAdapter) { adapter = pagedAdapter; if(adapterView == null) Log.w(TAG, "There is no ListView or GridView in this wrapper"); else transferAdapter(pagedAdapter); } private void transferAdapter(PagedAdapter pagedAdapter) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) adapterView.setAdapter(pagedAdapter); else if(adapterView instanceof ListView) ((ListView) adapterView).setAdapter(pagedAdapter); else if(adapterView instanceof GridView) ((GridView) adapterView).setAdapter(pagedAdapter); } public void showEmptyView() { removeEmptyView(); if(emptyView != null) addView(emptyView); } public void showEmptyErrorView() { removeEmptyView(); if(emptyErrorView != null) addView(emptyErrorView); } public void removeEmptyView() { removeView(emptyView); removeView(emptyErrorView); } public AbsListView getAdapterView() { return adapterView; } public void setLoadingView(View loadingView) { this.loadingView = loadingView; } public View getLoadingView() { return loadingView; } public void setErrorView(View errorView) { this.errorView = errorView; } public View getErrorView() { return errorView; } public void setEndView(View endView) { this.endView = endView; } public View getEndView() { return endView; } public View getEmptyView() { return emptyView; } public void setEmptyView(View emptyView) { this.emptyView = emptyView; } public View getEmptyErrorView() { return emptyErrorView; } public void setEmptyErrorView(View emptyErrorView) { this.emptyErrorView = emptyErrorView; if(emptyErrorView != null && reloadOnClickOnError) emptyErrorView.setOnClickListener(this); } public void setReloadOnClickOnError(boolean reloadOnClickOnError) { this.reloadOnClickOnError = reloadOnClickOnError; } public boolean isReloadOnClickOnError() { return reloadOnClickOnError; } @Override public void addView(View child) { addAdapterView(child); super.addView(child); } @Override public void addView(View child, int index) { addAdapterView(child); super.addView(child, index); } @Override public void addView(View child, int width, int height) { addAdapterView(child); super.addView(child, width, height); } @Override public void addView(View child, ViewGroup.LayoutParams params) { addAdapterView(child); super.addView(child, params); } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { addAdapterView(child); super.addView(child, index, params); } private void addAdapterView(View child) { if (child instanceof AbsListView) adapterView = (AbsListView) child; else if (adapterViewId != -1) findAdapterView(child); } private void findAdapterView(View child) { View adapterView = child.findViewById(adapterViewId); if (adapterView instanceof AbsListView) { this.adapterView = (AbsListView) adapterView; } } @Override public void onClick(View v) { if(v.equals(emptyErrorView) && reloadOnClickOnError && adapter != null) adapter.loadNextItems(); } }