package com.mcxtzhang.commonadapter.viewgroup;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import com.mcxtzhang.commonadapter.viewgroup.adapter.base.IViewGroupAdapter;
import com.mcxtzhang.commonadapter.viewgroup.listener.OnItemClickListener;
import com.mcxtzhang.commonadapter.viewgroup.listener.OnItemLongClickListener;
/**
* Intro A util to add views for any viewgroup.
* Author zhangxutong
* E-mail mcxtzhang@163.com
* Home Page http://blog.csdn.net/zxt0601
* Created 2017/1/13.
* Since 1.5.2
* History
*/
public class VGUtil {
ViewGroup mParent;
IViewGroupAdapter mAdapter;
DataSetObserver mDataSetObserver = new DataSetObserver() {
@Override
public void onChanged() {
refreshUI();
}
@Override
public void onInvalidated() {
}
};
boolean mRemainExistViews;
OnItemClickListener mOnItemClickListener;
OnItemLongClickListener mOnItemLongClickListener;
public VGUtil(ViewGroup parent, IViewGroupAdapter adapter) {
this(parent, adapter, false);
}
public VGUtil(ViewGroup parent, IViewGroupAdapter adapter, boolean remainExistViews) {
this(parent, adapter, remainExistViews, null, null);
}
public VGUtil(ViewGroup parent, IViewGroupAdapter adapter, OnItemClickListener onItemClickListener) {
this(parent, adapter, false, onItemClickListener, null);
}
public VGUtil(ViewGroup parent, IViewGroupAdapter adapter, OnItemLongClickListener onItemLongClickListener) {
this(parent, adapter, false, null, onItemLongClickListener);
}
public VGUtil(ViewGroup parent, IViewGroupAdapter adapter, boolean remainExistViews, OnItemClickListener onItemClickListener, OnItemLongClickListener onItemLongClickListener) {
if (parent == null || adapter == null) {
throw new IllegalArgumentException("ViewGroup or Adapter can't be null! ");
}
if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
mParent = parent;
mAdapter = adapter;
mAdapter.registerDataSetObserver(mDataSetObserver);
mRemainExistViews = remainExistViews;
mOnItemClickListener = onItemClickListener;
mOnItemLongClickListener = onItemLongClickListener;
}
/**
* Begin bind views for {@link #mParent}
*/
public VGUtil bind() {
return bind(false);
}
/**
* Refresh ui for {@link #mParent}.
* This method will reset {@link OnItemClickListener} and {@link OnItemLongClickListener}
*
* @return
*/
public VGUtil refreshUI() {
return bind(true);
}
private VGUtil bind(boolean refresh) {
if (mParent == null || mAdapter == null) {
return this;
}
//Step 1
//If need clear all existed views
if (!mRemainExistViews) {
mAdapter.recycleViews(mParent);
}
//Step 2, begin add views
int count = mAdapter.getCount();
for (int i = 0; i < count; i++) {
//Get itemView by adapter
View itemView = mAdapter.getView(mParent, i);
mParent.addView(itemView);
//Step 3 (Optional),
//If item has not set click listener before, add click listener for each item.
//If in refresh , reset click listener
if (null != mOnItemClickListener && (!itemView.isClickable() || refresh)) {
final int finalI = i;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnItemClickListener.onItemClick(mParent, view, finalI);
}
});
}
//If item has not set long click listener before, add long click listener for each item.
if (null != mOnItemLongClickListener && (!itemView.isLongClickable() || refresh)) {
final int finalI = i;
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
return mOnItemLongClickListener.onItemLongClick(mParent, view, finalI);
}
});
}
}
return this;
}
}