package com.jacky.uikit.adapter;
import android.database.DataSetObserver;
import java.util.ArrayList;
import java.util.List;
import static com.jacky.uikit.adapter.ViewHolder.ViewObject;
/**
* Control ViewHolder Adapter
*
* @date 2016.3.1
*/
public class ViewHolderController<T> {
private List<ViewObject<T>> mViewData;
private List<T> mOriginalData;
private DataSetObserver dataSetObserver = new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
try {
fillViewData(mOriginalData);
} catch (Exception e) {
e.printStackTrace();
}
}
};
public ViewHolderController(List<T> data) {
mOriginalData = data;
fillViewData(data);
}
public DataSetObserver getDataSetObserver() {
return dataSetObserver;
}
/**
* Convert raw data into ViewObject
*
* @param originalData
*/
private void fillViewData(List<T> originalData) {
List<ViewObject<T>> tempList = new ArrayList<ViewObject<T>>();
if (mViewData == null) {
mViewData = new ArrayList<ViewObject<T>>();
}
if (originalData != null) {
if (!mViewData.isEmpty()) {
for (T data : originalData) {
//判断是否有相同数据
ViewObject<T> viewObject = contain(data);
if (viewObject != null) {
tempList.add(new ViewObject<T>(data, viewObject.mExtraData));
} else {
tempList.add(new ViewObject<T>(data));
}
}
} else {
for (T data : originalData) {
tempList.add(new ViewObject<T>(data));
}
}
mViewData.clear();
mViewData.addAll(tempList);
}
}
private ViewObject<T> contain(T data) {
for (ViewObject<T> viewObject : mViewData) {
if (viewObject.mData == data) {
return viewObject;
}
}
return null;
}
public ViewObject<T> getViewObject(int position) {
if (mViewData != null && position >= 0 && position < mViewData.size())
return mViewData.get(position);
return null;
}
public List<T> getListData() {
return mOriginalData;
}
public List<ViewObject<T>> getViewListData() {
return mViewData;
}
public int getCount() {
if (mViewData != null) return mViewData.size();
return 0;
}
public T getItem(int position) {
if (mViewData != null && position >= 0 && position < mViewData.size())
return mViewData.get(position).mData;
return null;
}
/**
* remove
*
* @param entrys
*/
public boolean removeEntrys(List<T> entrys) {
if (entrys == null || entrys.isEmpty()) {
return false;
}
boolean needUpdate = false;
for (T removeEntry : entrys) {
for (int i = 0; i < mOriginalData.size(); i++) {
T t = mOriginalData.get(i);
if (t == removeEntry) {
mOriginalData.remove(t);
needUpdate = true;
}
}
for (int i = 0; i < mViewData.size(); i++) {
ViewObject<T> viewObject = mViewData.get(i);
if (viewObject.mData == removeEntry) {
viewObject.mData = null;
mViewData.remove(viewObject);
}
}
}
return needUpdate;
}
/**
* remove one
*
* @param entry
*/
public boolean removeEntry(T entry) {
int pos = mOriginalData.indexOf(entry);
if (pos != -1) {
mOriginalData.remove(entry);
for (int i = 0; i < mViewData.size(); i++) {
ViewObject<T> viewObject = mViewData.get(i);
if (viewObject.mData == entry) {
viewObject.mData = null;
mViewData.remove(viewObject);
}
}
return true;
}
return false;
}
/**
* Add one
*
* @param entry
*/
public boolean addEntry(T entry) {
if (!mOriginalData.contains(entry)) {
mOriginalData.add(entry);
mViewData.add(new ViewObject<T>(entry));
return true;
}
return false;
}
/**
* Add one
*
* @param entry
*/
public boolean addEntry(int index, T entry) {
if (!mOriginalData.contains(entry)) {
mOriginalData.add(index, entry);
mViewData.add(index, new ViewObject<T>(entry));
return true;
}
return false;
}
/**
* Add a number of data
*
* @param entrys
*/
public boolean addEntrys(List<T> entrys) {
if (entrys == null || entrys.isEmpty()) {
return false;
}
mOriginalData.addAll(entrys);
for (T entry : entrys) {
mViewData.add(new ViewObject<T>(entry));
}
return true;
}
public void release() {
if (mOriginalData != null) {
mOriginalData.clear();
}
if (mViewData != null) {
mViewData.clear();
}
}
}