diff --git a/devsmartlib/.classpath b/devsmartlib/.classpath
index a4f1e40..3f9691c 100644
--- a/devsmartlib/.classpath
+++ b/devsmartlib/.classpath
@@ -1,8 +1,8 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/devsmartlib/.gitignore b/devsmartlib/.gitignore
index 93ca21e..40141f8 100644
--- a/devsmartlib/.gitignore
+++ b/devsmartlib/.gitignore
@@ -1,2 +1,33 @@
-/bin
-/gen
\ No newline at end of file
+# built application files
+*.apk
+*.ap_
+
+# files for the dex VM
+*.dex
+
+# Java class files
+*.class
+
+# generated files
+bin/
+gen/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Eclipse project files
+.classpath
+.project
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Intellij project files
+*.iml
+*.ipr
+*.iws
+.idea/
+
+
+build.xml
+proguard-project.txt
\ No newline at end of file
diff --git a/devsmartlib/.project b/devsmartlib/.project
index d8e4190..3e0bd66 100644
--- a/devsmartlib/.project
+++ b/devsmartlib/.project
@@ -1,6 +1,6 @@
- DevsmartAndroid
+ _Devsmartlib
diff --git a/devsmartlib/libs/android-support-v4.jar b/devsmartlib/libs/android-support-v4.jar
index feaf44f..6080877 100644
Binary files a/devsmartlib/libs/android-support-v4.jar and b/devsmartlib/libs/android-support-v4.jar differ
diff --git a/devsmartlib/src/com/devsmart/android/ui/HorizontalListView.java b/devsmartlib/src/com/devsmart/android/ui/HorizontalListView.java
index 076ed38..e57b0e4 100644
--- a/devsmartlib/src/com/devsmart/android/ui/HorizontalListView.java
+++ b/devsmartlib/src/com/devsmart/android/ui/HorizontalListView.java
@@ -44,334 +44,350 @@
public class HorizontalListView extends AdapterView {
- public boolean mAlwaysOverrideTouch = true;
- protected ListAdapter mAdapter;
- private int mLeftViewIndex = -1;
- private int mRightViewIndex = 0;
- protected int mCurrentX;
- protected int mNextX;
- private int mMaxX = Integer.MAX_VALUE;
- private int mDisplayOffset = 0;
- protected Scroller mScroller;
- private GestureDetector mGesture;
- private Queue mRemovedViewQueue = new LinkedList();
- private OnItemSelectedListener mOnItemSelected;
- private OnItemClickListener mOnItemClicked;
- private OnItemLongClickListener mOnItemLongClicked;
- private boolean mDataChanged = false;
-
-
- public HorizontalListView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initView();
- }
-
- private synchronized void initView() {
- mLeftViewIndex = -1;
- mRightViewIndex = 0;
- mDisplayOffset = 0;
- mCurrentX = 0;
- mNextX = 0;
- mMaxX = Integer.MAX_VALUE;
- mScroller = new Scroller(getContext());
- mGesture = new GestureDetector(getContext(), mOnGesture);
- }
-
- @Override
- public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) {
- mOnItemSelected = listener;
- }
-
- @Override
- public void setOnItemClickListener(AdapterView.OnItemClickListener listener){
- mOnItemClicked = listener;
- }
-
- @Override
- public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) {
- mOnItemLongClicked = listener;
- }
-
- private DataSetObserver mDataObserver = new DataSetObserver() {
-
- @Override
- public void onChanged() {
- synchronized(HorizontalListView.this){
- mDataChanged = true;
- }
- invalidate();
- requestLayout();
- }
-
- @Override
- public void onInvalidated() {
- reset();
- invalidate();
- requestLayout();
- }
-
- };
-
- @Override
- public ListAdapter getAdapter() {
- return mAdapter;
- }
-
- @Override
- public View getSelectedView() {
- //TODO: implement
- return null;
- }
-
- @Override
- public void setAdapter(ListAdapter adapter) {
- if(mAdapter != null) {
- mAdapter.unregisterDataSetObserver(mDataObserver);
- }
- mAdapter = adapter;
- mAdapter.registerDataSetObserver(mDataObserver);
- reset();
- }
-
- private synchronized void reset(){
- initView();
- removeAllViewsInLayout();
+ public boolean mAlwaysOverrideTouch = true;
+ protected ListAdapter mAdapter;
+ private int mLeftViewIndex = -1;
+ private int mRightViewIndex = 0;
+ protected int mCurrentX;
+ protected int mNextX;
+ private int mMaxX = Integer.MAX_VALUE;
+ private int mDisplayOffset = 0;
+ protected Scroller mScroller;
+ private GestureDetector mGesture;
+ private Queue mRemovedViewQueue = new LinkedList();
+ private OnItemSelectedListener mOnItemSelected;
+ private OnItemLongClickListener mOnItemLongClicked;
+ private boolean mDataChanged = false;
+
+ private enum DownloadType {
+ CACHE, DOWNLOAD, NONE;
+ }
+
+ public HorizontalListView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initView();
+ }
+
+ private synchronized void initView() {
+ mLeftViewIndex = -1;
+ mRightViewIndex = 0;
+ mDisplayOffset = 0;
+ mCurrentX = 0;
+ mNextX = 0;
+ mMaxX = Integer.MAX_VALUE;
+ mScroller = new Scroller(getContext());
+ mGesture = new GestureDetector(getContext(), mOnGesture);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
+ int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
+
+ setMeasuredDimension(MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(parentHeight, MeasureSpec.EXACTLY));
+ }
+
+ @Override
+ public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) {
+ mOnItemSelected = listener;
+ }
+
+ @Override
+ public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) {
+ mOnItemLongClicked = listener;
+ }
+
+ private DataSetObserver mDataObserver = new DataSetObserver() {
+
+ @Override
+ public void onChanged() {
+ synchronized (HorizontalListView.this) {
+ mDataChanged = true;
+ }
+ invalidate();
+ requestLayout();
+ }
+
+ @Override
+ public void onInvalidated() {
+ reset();
+ invalidate();
+ requestLayout();
+ }
+
+ };
+
+ @Override
+ public ListAdapter getAdapter() {
+ return mAdapter;
+ }
+
+ @Override
+ public View getSelectedView() {
+ // TODO: implement
+ return null;
+ }
+
+ @Override
+ public void setAdapter(ListAdapter adapter) {
+ if (mAdapter != null) {
+ mAdapter.unregisterDataSetObserver(mDataObserver);
+ }
+ mAdapter = adapter;
+ mAdapter.registerDataSetObserver(mDataObserver);
+ reset();
+ }
+
+ private synchronized void reset() {
+ initView();
+ removeAllViewsInLayout();
+ requestLayout();
+ }
+
+ public static abstract class OnItemUpdateListener {
+
+ public abstract void updateOnStop(AdapterView> adapterView, View view, int position, long id);
+
+ public abstract void updateFling(AdapterView> adapterView, View view, int position, long id);
+
+ }
+
+ @Override
+ public void setSelection(int position) {
+ // TODO: implement
+ }
+
+ private void addAndMeasureChild(final View child, int viewPos) {
+ LayoutParams params = child.getLayoutParams();
+ if (params == null) {
+ params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ }
+
+ child.setTag(DownloadType.NONE);// update ui
+ addViewInLayout(child, viewPos, params, true);
+ child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
+ }
+
+ @Override
+ protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+
+ if (mAdapter == null) {
+ return;
+ }
+
+ if (mDataChanged) {
+ int oldCurrentX = mCurrentX;
+ initView();
+ removeAllViewsInLayout();
+ mNextX = oldCurrentX;
+ mDataChanged = false;
+ }
+
+ if (mScroller.computeScrollOffset()) {
+ int scrollx = mScroller.getCurrX();
+ mNextX = scrollx;
+ }
+
+ if (mNextX <= 0) {
+ mNextX = 0;
+ mScroller.forceFinished(true);
+ }
+ if (mNextX >= mMaxX) {
+ mNextX = mMaxX;
+ mScroller.forceFinished(true);
+ }
+
+ int dx = mCurrentX - mNextX;
+
+ removeNonVisibleItems(dx);
+ fillList(dx);
+ positionItems(dx);
+
+ mCurrentX = mNextX;
+
+ if (!mScroller.isFinished()) {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ requestLayout();
+ }
+ });
+
+ }
+
+ if (!mScroller.isFinished()) {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ requestLayout();
+ }
+ });
+ }
+ }
+
+ private void fillList(final int dx) {
+ int edge = 0;
+ View child = getChildAt(getChildCount() - 1);
+ if (child != null) {
+ edge = child.getRight();
+ }
+ fillListRight(edge, dx);
+
+ edge = 0;
+ child = getChildAt(0);
+ if (child != null) {
+ edge = child.getLeft();
+ }
+ fillListLeft(edge, dx);
+
+ }
+
+ private void fillListRight(int rightEdge, final int dx) {
+ while (rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {
+
+ View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this);
+ addAndMeasureChild(child, -1);
+ rightEdge += child.getMeasuredWidth();
+
+ if (mRightViewIndex == mAdapter.getCount() - 1) {
+ mMaxX = mCurrentX + rightEdge - getWidth();
+ }
+
+ if (mMaxX < 0) {
+ mMaxX = 0;
+ }
+ mRightViewIndex++;
+ }
+
+ }
+
+ private void fillListLeft(int leftEdge, final int dx) {
+ while (leftEdge + dx > 0 && mLeftViewIndex >= 0) {
+ View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);
+ addAndMeasureChild(child, 0);
+ leftEdge -= child.getMeasuredWidth();
+ mLeftViewIndex--;
+ mDisplayOffset -= child.getMeasuredWidth();
+ }
+ }
+
+ private void removeNonVisibleItems(final int dx) {
+ View child = getChildAt(0);
+ while (child != null && child.getRight() + dx <= 0) {
+ mDisplayOffset += child.getMeasuredWidth();
+ mRemovedViewQueue.offer(child);
+ removeViewInLayout(child);
+ mLeftViewIndex++;
+ child = getChildAt(0);
+
+ }
+
+ child = getChildAt(getChildCount() - 1);
+ while (child != null && child.getLeft() + dx >= getWidth()) {
+ mRemovedViewQueue.offer(child);
+ removeViewInLayout(child);
+ mRightViewIndex--;
+ child = getChildAt(getChildCount() - 1);
+ }
+ }
+
+ private void positionItems(final int dx) {
+ if (getChildCount() > 0) {
+ mDisplayOffset += dx;
+ int left = mDisplayOffset;
+ for (int i = 0; i < getChildCount(); i++) {
+ View child = getChildAt(i);
+ int childWidth = child.getMeasuredWidth();
+ child.layout(left, 0, left + childWidth, child.getMeasuredHeight());
+ left += childWidth + child.getPaddingRight();
+ }
+ }
+ }
+
+ public synchronized void scrollTo(int x) {
+ mScroller.startScroll(mNextX, 0, x - mNextX, 0);
requestLayout();
- }
-
- @Override
- public void setSelection(int position) {
- //TODO: implement
- }
-
- private void addAndMeasureChild(final View child, int viewPos) {
- LayoutParams params = child.getLayoutParams();
- if(params == null) {
- params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
- }
-
- addViewInLayout(child, viewPos, params, true);
- child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
- }
-
-
-
- @Override
- protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- if(mAdapter == null){
- return;
- }
-
- if(mDataChanged){
- int oldCurrentX = mCurrentX;
- initView();
- removeAllViewsInLayout();
- mNextX = oldCurrentX;
- mDataChanged = false;
- }
-
- if(mScroller.computeScrollOffset()){
- int scrollx = mScroller.getCurrX();
- mNextX = scrollx;
- }
-
- if(mNextX <= 0){
- mNextX = 0;
- mScroller.forceFinished(true);
- }
- if(mNextX >= mMaxX) {
- mNextX = mMaxX;
- mScroller.forceFinished(true);
- }
-
- int dx = mCurrentX - mNextX;
-
- removeNonVisibleItems(dx);
- fillList(dx);
- positionItems(dx);
-
- mCurrentX = mNextX;
-
- if(!mScroller.isFinished()){
- post(new Runnable(){
- @Override
- public void run() {
- requestLayout();
- }
- });
-
- }
- }
-
- private void fillList(final int dx) {
- int edge = 0;
- View child = getChildAt(getChildCount()-1);
- if(child != null) {
- edge = child.getRight();
- }
- fillListRight(edge, dx);
-
- edge = 0;
- child = getChildAt(0);
- if(child != null) {
- edge = child.getLeft();
- }
- fillListLeft(edge, dx);
-
-
- }
-
- private void fillListRight(int rightEdge, final int dx) {
- while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {
-
- View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this);
- addAndMeasureChild(child, -1);
- rightEdge += child.getMeasuredWidth();
-
- if(mRightViewIndex == mAdapter.getCount()-1) {
- mMaxX = mCurrentX + rightEdge - getWidth();
- }
-
- if (mMaxX < 0) {
- mMaxX = 0;
- }
- mRightViewIndex++;
- }
-
- }
-
- private void fillListLeft(int leftEdge, final int dx) {
- while(leftEdge + dx > 0 && mLeftViewIndex >= 0) {
- View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);
- addAndMeasureChild(child, 0);
- leftEdge -= child.getMeasuredWidth();
- mLeftViewIndex--;
- mDisplayOffset -= child.getMeasuredWidth();
- }
- }
-
- private void removeNonVisibleItems(final int dx) {
- View child = getChildAt(0);
- while(child != null && child.getRight() + dx <= 0) {
- mDisplayOffset += child.getMeasuredWidth();
- mRemovedViewQueue.offer(child);
- removeViewInLayout(child);
- mLeftViewIndex++;
- child = getChildAt(0);
-
- }
-
- child = getChildAt(getChildCount()-1);
- while(child != null && child.getLeft() + dx >= getWidth()) {
- mRemovedViewQueue.offer(child);
- removeViewInLayout(child);
- mRightViewIndex--;
- child = getChildAt(getChildCount()-1);
- }
- }
-
- private void positionItems(final int dx) {
- if(getChildCount() > 0){
- mDisplayOffset += dx;
- int left = mDisplayOffset;
- for(int i=0;i