自定义ScrollView的刷新加载
来源:互联网 发布:微信商城java源码下载 编辑:程序博客网 时间:2024/06/05 05:35
准备工作:
创建一个library
资源文件:
color:
<?xml version="1.0" encoding="utf-8"?><resources> <color name="white">#ffffffff</color> <color name="black">#ff000000</color> <color name="transparent">#00000000</color></resources>
strings.xml
<resources> <string name="app_name">Refreshlayout</string> <string name="xscrollview_header_hint_normal">下拉刷新</string> <string name="xscrollview_header_hint_ready">松开刷新</string> <string name="xscrollview_header_hint_loading">加载数据...</string> <string name="xscrollview_header_last_time">最近刷新</string> <string name="xscrollview_footer_hint_normal">加载更多</string> <string name="xscrollview_footer_hint_ready">松开加载</string></resources>
layout:
1.xscrollview.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="1200dp" android:orientation="vertical" > <FrameLayout android:id="@+id/head_ly" android:layout_width="match_parent" android:layout_height="60dp" android:layout_marginTop="-60dp" > </FrameLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <RelativeLayout android:id="@+id/content_ly" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@+id/foot_ly" android:layout_width="match_parent" android:layout_height="40dp" > </FrameLayout> </LinearLayout></LinearLayout>
2.xscrollview_header.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="bottom" > <RelativeLayout android:id="@+id/xscrollview_header_content" android:layout_width="fill_parent" android:layout_height="60dp" > <LinearLayout android:id="@+id/xscrollview_header_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/xscrollview_header_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/xscrollview_header_hint_normal" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/xscrollview_header_last_time" android:textSize="12sp" /> <TextView android:id="@+id/xscrollview_header_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/xscrollview_header_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/xscrollview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-75dp" android:src="@mipmap/xscrollview_arrow" /> <ProgressBar android:id="@+id/xscrollview_header_progressbar" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignLeft="@id/xscrollview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-80dp" android:visibility="invisible" /> </RelativeLayout></LinearLayout>
3.xscrollview_footer.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/xscrollview_footer_content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp" > <ProgressBar android:id="@+id/xscrollview_footer_progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="invisible" /> <TextView android:id="@+id/xscrollview_footer_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/xscrollview_footer_hint_normal" /> </RelativeLayout></LinearLayout>
Java
1.XScrollView
import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver.OnGlobalLayoutListener;import android.widget.FrameLayout;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.ScrollView;import android.widget.TextView;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;/** * 可以下拉刷新的scrollView * */public class XScrollView extends ScrollView { private static final int PULL_TO_REFRESH_STATUS = 0x00; // 下拉刷新 private static final int RELEASE_TO_REFRESH_STATUS = 0x01; // 释放刷新 protected static final int REFRESHING_STATUS = 0x02; private static final int NORMAL_STATUS = 0x03; // mode head or foot private static final int HEAD_MODE = 0x00; private static final int FOOT_MODE = 0x01; protected int mStatus = NORMAL_STATUS; private int mMode = HEAD_MODE; protected RelativeLayout mContentLy; private float mLastY = -1000; private FrameLayout mHeadViewLy; private FrameLayout mFootViewLy; private TextView mHeaderTimeView; private float mDowY; private final static int PULL_LOAD_MORE_DELTA = 50; private ILoadingLayout mHeadLoadingView; private ILoadingLayout mFootLoadingView; private boolean mIsAnimation; private int mDefautlTopMargin; private boolean mEnablePullRefresh = true; private boolean mEnablePullLoad = true; private final static int SCROLL_DURATION = 200; private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.getDefault()); public interface OnScrollUpDownListener { public void onScrollUp(boolean isUp); } private OnScrollUpDownListener mScrollUpDown; private IXScrollViewListener mScrollViewListener; public XScrollView(Context context) { this(context, null); } public XScrollView(Context context, AttributeSet attrs) { super(context, attrs); View view = LayoutInflater.from(context).inflate(R.layout.xscrollview, null, false); ViewGroup.LayoutParams params = generateLayoutParams(attrs); super.addView(view, params); mContentLy = (RelativeLayout) findViewById(R.id.content_ly); mHeadViewLy = (FrameLayout) findViewById(R.id.head_ly); mFootViewLy = (FrameLayout) findViewById(R.id.foot_ly); mHeadLoadingView = new HeadLoadingView(context); mHeaderTimeView = (TextView) ((View) mHeadLoadingView) .findViewById(R.id.xscrollview_header_time); mFootLoadingView = new FootLoadingView(context); mHeadViewLy.addView((View) mHeadLoadingView); mFootViewLy.addView((View) mFootLoadingView); mHeadLoadingView.normal(); mFootLoadingView.normal(); mHeadViewLy.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mDefautlTopMargin = -mHeadViewLy.getHeight(); getViewTreeObserver() .removeGlobalOnLayoutListener(this); } }); setFadingEdgeLength(0); setRefreshTime(); } public void addView(View child, ViewGroup.LayoutParams params) { mContentLy.addView(child, params); } public void setOnScrollUpDownListener(OnScrollUpDownListener listener) { mScrollUpDown = listener; } public void stopRefresh() { MaginAnimation maginAnim = new MaginAnimation(0, (int) mDefautlTopMargin, SCROLL_DURATION); maginAnim.startAnimation(mHeadViewLy); maginAnim.setOnAnimationOverListener(new OnAnimationOverListener() { @Override public void onOver() { updateStatus(NORMAL_STATUS, mHeadLoadingView); } }); setRefreshTime(); } public void stopLoadMore() { updateStatus(NORMAL_STATUS, mFootLoadingView); } /** * 显示和隐藏下拉刷新 * @param enable */ public void setPullRefreshEnable(boolean enable) { if (enable) { mEnablePullRefresh = true; mHeadViewLy.setVisibility(View.VISIBLE); } else { mEnablePullRefresh = false; mHeadViewLy.setVisibility(View.INVISIBLE); } } /** * 显示和隐藏上拉加载 * @param enable */ public void setPullLoadEnable(boolean enable) { if (enable) { mEnablePullLoad = true; mFootViewLy.setVisibility(View.VISIBLE); } else { mEnablePullLoad = false; mFootViewLy.setVisibility(View.INVISIBLE); LinearLayout.LayoutParams lllp = (LinearLayout.LayoutParams) mFootViewLy .getLayoutParams(); lllp.height = 0; mFootViewLy.setLayoutParams(lllp); } } private void setRefreshTime() { mHeaderTimeView.setText(sdf.format(new Date())); } public void setToRefreshing() { MaginAnimation maginAnim = new MaginAnimation(getHeadViewTopMargin(), 0, SCROLL_DURATION); maginAnim.startAnimation(mHeadViewLy); maginAnim.setOnAnimationOverListener(new OnAnimationOverListener() { @Override public void onOver() { updateStatus(REFRESHING_STATUS, mHeadLoadingView); } }); } @Override public boolean onTouchEvent(MotionEvent ev) { if (mIsAnimation) { return super.onTouchEvent(ev); } int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: mLastY = ev.getY(); mDowY = ev.getY(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (null != mScrollUpDown) { if (ev.getY() - mDowY >= 20) { mScrollUpDown.onScrollUp(true); } else if (ev.getY() - mDowY <= -30) { mScrollUpDown.onScrollUp(false); } } release(mStatus); mLastY = -1000; break; case MotionEvent.ACTION_MOVE: // 判断是不是首次移动 if (-1000 == mLastY) { mLastY = ev.getY(); mDowY = ev.getY(); return super.onTouchEvent(ev); } final float lastY = mLastY; float nowY = ev.getY(); int deltaY = (int) (lastY - nowY); mLastY = nowY; if (deltaY < 0) { // down if (getScrollY() == 0 && mStatus != REFRESHING_STATUS) { updateMode(HEAD_MODE); updateHeadMargin(deltaY / 2); if (getHeadViewTopMargin() >= 0) { updateStatus(RELEASE_TO_REFRESH_STATUS, mHeadLoadingView); } else { updateStatus(PULL_TO_REFRESH_STATUS, mHeadLoadingView); } return super.onTouchEvent(ev); } if (mStatus != REFRESHING_STATUS && mStatus != NORMAL_STATUS) { // foot updateMode(FOOT_MODE); updateFootPadding(deltaY / 2); if (getPaddingBottom() > 0 && getPaddingBottom() < PULL_LOAD_MORE_DELTA) { updateStatus(PULL_TO_REFRESH_STATUS, mFootLoadingView); } else if (getPaddingBottom() >= PULL_LOAD_MORE_DELTA) { updateStatus(RELEASE_TO_REFRESH_STATUS, mFootLoadingView); } else if (getPaddingBottom() == 0) { updateStatus(NORMAL_STATUS, mFootLoadingView); } } } else { // up if (mMode == HEAD_MODE && mStatus != REFRESHING_STATUS && mStatus != NORMAL_STATUS) { // head updateMode(HEAD_MODE); updateHeadMargin(deltaY / 2); if (getHeadViewTopMargin() > mDefautlTopMargin && getHeadViewTopMargin() < 0) { if (mEnablePullRefresh) { updateStatus(PULL_TO_REFRESH_STATUS, mHeadLoadingView); } } else if (getHeadViewTopMargin() == mDefautlTopMargin) { updateStatus(NORMAL_STATUS, mHeadLoadingView); } return super.onTouchEvent(ev); } if (getScrollY() + getHeight() >= mContentLy.getHeight() + mFootViewLy.getHeight() && mStatus != REFRESHING_STATUS) { // foot updateMode(FOOT_MODE); updateFootPadding(deltaY / 2); if (getPaddingBottom() >= PULL_LOAD_MORE_DELTA) { updateStatus(RELEASE_TO_REFRESH_STATUS, mFootLoadingView); } else { updateStatus(PULL_TO_REFRESH_STATUS, mFootLoadingView); } } } break; default: break; } return super.onTouchEvent(ev); } private void updateHeadMargin(int deltaY) { LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) mHeadViewLy .getLayoutParams(); param.topMargin -= deltaY; if (param.topMargin <= mDefautlTopMargin) { param.topMargin = (int) mDefautlTopMargin; } mHeadViewLy.setLayoutParams(param); } private void updateFootPadding(int deltaY) { int bottomPadding = getPaddingBottom() + deltaY; if (bottomPadding <= 0) { bottomPadding = 0; } setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), bottomPadding); } private void updateStatus(int status, ILoadingLayout layout) { if (mStatus == status) { return; } mStatus = status; switch (status) { case PULL_TO_REFRESH_STATUS: layout.pullToRefresh(); // 下拉刷新 break; case RELEASE_TO_REFRESH_STATUS: layout.releaseToRefresh(); break; case REFRESHING_STATUS: layout.refreshing(); break; case NORMAL_STATUS: layout.normal(); break; default: break; } } private void updateMode(int mode) { mMode = mode; } private int getHeadViewTopMargin() { LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) mHeadViewLy .getLayoutParams(); return param.topMargin; } private void release(int status) { if (HEAD_MODE == mMode) { headReleas(); } else if (FOOT_MODE == mMode) { footReleas(); } } private void headReleas() { int toMagin; if (RELEASE_TO_REFRESH_STATUS == mStatus) { toMagin = 0; } else if (PULL_TO_REFRESH_STATUS == mStatus) { toMagin = (int) mDefautlTopMargin; } else { return; } MaginAnimation maginAnim = new MaginAnimation(getHeadViewTopMargin(), toMagin, SCROLL_DURATION); maginAnim.startAnimation(mHeadViewLy); maginAnim.setOnAnimationOverListener(new OnAnimationOverListener() { @Override public void onOver() { if (mStatus == RELEASE_TO_REFRESH_STATUS) { if (null != mScrollViewListener) { updateStatus(REFRESHING_STATUS, mHeadLoadingView); if (mEnablePullRefresh) { mScrollViewListener.onRefresh(); } else { stopRefresh(); } } } else if (mStatus == PULL_TO_REFRESH_STATUS) { updateStatus(NORMAL_STATUS, mHeadLoadingView); } } }); } private void footReleas() { if (getPaddingBottom() > PULL_LOAD_MORE_DELTA) { if (null != mScrollViewListener) { updateStatus(REFRESHING_STATUS, mFootLoadingView); if (mEnablePullLoad) { mScrollViewListener.onLoadMore(); } else { stopLoadMore(); } } } else { updateStatus(NORMAL_STATUS, mFootLoadingView); } updateFootPadding(-getPaddingBottom()); } public interface IXScrollViewListener { public void onRefresh(); public void onLoadMore(); } public void setXScrollViewListener(IXScrollViewListener l) { mScrollViewListener = l; }}
2.OnAnimationOverListener
public interface OnAnimationOverListener { void onOver();}
3.MaginAnimation
import android.util.Log;import android.view.View;import android.widget.LinearLayout;import java.util.Timer;import java.util.TimerTask;public class MaginAnimation { // top magin private int mStep = 5; private int mPeriod = 10; private int mToMaing; private boolean mIsOver = false; private OnAnimationOverListener mOverListener; public MaginAnimation(int startMagin, int toMagin, int duration) { float abs = Math.abs(startMagin - toMagin); float a = abs / (float) mStep; mToMaing = toMagin; Log.d("abs / mStep > ", "start " + startMagin + " to margin" + toMagin); mPeriod = (int) ((float) duration / a); Log.d("the period period is ", mPeriod + ""); } public void setOnAnimationOverListener(OnAnimationOverListener l) { mOverListener = l; } public void startAnimation(final View view) { mIsOver = false; final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { view.post(new Runnable() { @Override public void run() { LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) view .getLayoutParams(); param.topMargin -= mStep; if (param.topMargin <= mToMaing) { param.topMargin = mToMaing; timer.cancel(); mIsOver = true; } view.setLayoutParams(param); if (mIsOver && null != mOverListener) { mOverListener.onOver(); } } }); } }, 0, mPeriod); }}
4.ILoadingLayout
public interface ILoadingLayout { public void pullToRefresh(); public void releaseToRefresh(); public void refreshing(); public void normal();}
5.HeadLoadingView
public class HeadLoadingView extends LinearLayout implements ILoadingLayout { private Animation mRotateUpAnim; private Animation mRotateDownAnim; private View mLeftProgress; private ImageView mLeftImage; private TextView mTitle; private boolean mImageIsUp; private final int ROTATE_ANIM_DURATION = 180; public HeadLoadingView(Context context) { this(context, null); mRotateUpAnim = new RotateAnimation(0.0f, -180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION); mRotateUpAnim.setFillAfter(true); mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION); mRotateDownAnim.setFillAfter(true); LayoutInflater.from(context).inflate(R.layout.xscrollview_header, this); mLeftProgress = (ProgressBar) findViewById(R.id.xscrollview_header_progressbar); mLeftImage = (ImageView) findViewById(R.id.xscrollview_header_arrow); mTitle = (TextView) findViewById(R.id.xscrollview_header_hint_textview); } public HeadLoadingView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void pullToRefresh() { if (mImageIsUp) { mLeftImage.startAnimation(mRotateDownAnim); mImageIsUp = false; } mTitle.setText(getResources().getString( R.string.xscrollview_header_hint_normal)); } @Override public void releaseToRefresh() { mLeftImage.startAnimation(mRotateUpAnim); mImageIsUp = true; mTitle.setText(getResources().getString( R.string.xscrollview_header_hint_ready)); } @Override public void refreshing() { mImageIsUp = false; mLeftProgress.setVisibility(View.VISIBLE); mTitle.setText(getResources().getString( R.string.xscrollview_header_hint_loading)); mLeftImage.clearAnimation(); mLeftImage.setVisibility(View.INVISIBLE); } @Override public void normal() { mImageIsUp = false; mLeftImage.setVisibility(View.VISIBLE); mLeftProgress.setVisibility(View.GONE); mTitle.setText(getResources().getString( R.string.xscrollview_header_hint_normal)); }}
6.FootLoadingView
public class FootLoadingView extends LinearLayout implements ILoadingLayout { private TextView mTitleTv; private ProgressBar mProgress; public FootLoadingView(Context context) { this(context, null); } public FootLoadingView(Context context, AttributeSet attrs) { super(context, attrs); inflate(context, R.layout.xscrollview_footer, this); mTitleTv = (TextView) findViewById(R.id.xscrollview_footer_hint_textview); mProgress = (ProgressBar) findViewById(R.id.xscrollview_footer_progressbar); } @Override public void pullToRefresh() { mTitleTv.setVisibility(View.VISIBLE); mTitleTv.setText(getResources().getString( R.string.xscrollview_footer_hint_normal)); } @Override public void releaseToRefresh() { mTitleTv.setVisibility(View.VISIBLE); mTitleTv.setText(getResources().getString( R.string.xscrollview_footer_hint_ready)); } @Override public void refreshing() { mTitleTv.setVisibility(View.INVISIBLE); mProgress.setVisibility(View.VISIBLE); } @Override public void normal() { mTitleTv.setVisibility(View.VISIBLE); mTitleTv.setText(getResources().getString( R.string.xscrollview_footer_hint_normal)); mProgress.setVisibility(View.GONE); }}
最后补上一张图片:
到此,library中的内容已完成
附加两个常用的view 在ScrollView嵌套的时候用
1.BounceListView
public class BounceListView extends ListView { public BounceListView(Context context) { super(context); } public BounceListView(Context context, AttributeSet attrs) { super(context, attrs); } public BounceListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
2.BounceGridView
public class BounceGridView extends GridView { public BounceGridView(Context context) { super(context); } public BounceGridView(Context context, AttributeSet attrs) { super(context, attrs); } public BounceGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
创建一个项目,依赖上面的library
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" > <com.*****.refreshlibrary.view.XScrollView android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <com.*****.refreshlibrary.view.BounceListView android:id="@+id/item_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" android:listSelector="@color/transparent" /> </LinearLayout> </com.*****.refreshlibrary.view.XScrollView></RelativeLayout>
调用代码:
public class XScrollViewActivity extends Activity { private XScrollView scrollView = null; private ArrayList<String> nameArray = new ArrayList<>(); private ItemAdapter itemAdapter = null; private Random random = new Random(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.xscroll_view_activity); initView(); } private void initView() { scrollView = (XScrollView) findViewById(R.id.scroll); scrollView.setXScrollViewListener(new XScrollView.IXScrollViewListener() { @Override public void onRefresh() { handler.sendMessageDelayed(handler.obtainMessage(1), 1000); } @Override public void onLoadMore() { handler.sendMessageDelayed(handler.obtainMessage(2), 1000); } }); scrollView.setPullLoadEnable(false); // 取消上拉加载 BounceListView itemListView = (BounceListView) findViewById(R.id.item_list); itemAdapter = new ItemAdapter(this,nameArray); itemListView.setAdapter(itemAdapter); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 1) { nameArray.clear(); for (int i = 0; i < 20; i++) { nameArray.add("name" + random.nextInt()); } itemAdapter.notifyDataSetChanged(); scrollView.stopRefresh(); // 停止刷新 scrollView.smoothScrollTo(0, 0); // 滚动的时候平滑的效果 } else if (msg.what == 2) { for (int i = 0; i < 20; i++) { nameArray.add("name" + random.nextInt()); } itemAdapter.notifyDataSetChanged(); scrollView.stopLoadMore(); // 停止加载 } } };}
adapter:
public class ItemAdapter extends BaseAdapter { private Context context; private ArrayList<String> nameArray; public ItemAdapter(Context context, ArrayList<String> nameArray) { this.context = context; this.nameArray = nameArray; } @Override public int getCount() { if (nameArray != null && nameArray.size() > 0) { return nameArray.size(); }else{ return 0; } } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.item, null, false); holder.leftNameView = (TextView) convertView.findViewById(R.id.name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.leftNameView.setText(nameArray.get(position)); return convertView; } class ViewHolder { TextView leftNameView; }}
欢迎阅读
0 0
- 自定义ScrollView的刷新加载
- 自定义上拉刷新下拉加载ScrollView
- android基础知识----scrollview的上拉加载下拉刷新
- 自定义ScrollView实现下拉刷新
- RecycleView+SwipeToLoadLayout+Fresco的自定义刷新加载
- 自定义的RecyclerView, 下拉刷新,加载更多.
- Android自定义控件(一) 下拉刷新,上拉分页加载更多(支持ListView, GridView, ScrollView)
- Android自定义控件(二) 下拉刷新,上拉分页加载更多(支持ListView, GridView, ScrollView)
- 下来刷新的Scrollview
- 懒加载的Scrollview
- 懒加载的Scrollview
- 懒加载的Scrollview
- 懒加载的Scrollview
- 上拉刷新,下拉加载的靠谱的第三方。支持listview,scrollview,gridview等等
- 带下拉刷新的ScrollView
- Android scrollview中嵌套listview实现listview的下拉刷新上拉加载更多
- GridView加载刷新连带单独的图片用(ScrollView和GridView)解决冲突
- 通用的自定义的下拉刷新,上拉更多,适用listView,gridView,ScrollView
- echarts柱状图,改变柱状颜色
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(2)
- Jetty7.6 java.lang.IllegalStateException: Form too large 563410>200000或Form too many keys异常
- 业界难题-“跨库分页”的四种方案
- 手把手教你如何加入到github的开源世界!
- 自定义ScrollView的刷新加载
- 今天在写TableView的时候,懒加载了模型数组同时覆写了setter方法,报错了
- 文件下载
- (转)日积月累:ScrollView嵌套ListView只显示一行
- 亲和串 HDU
- iosblock
- 免安装版mysql安装流程
- [BZOJ 4197][Noi2015]寿司晚宴:状压DP
- POJ 2528 Mayor's posters (线段树&离散化&延迟更新)