1、自定义ListView

import java.util.Date;import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;public class RefreshAndLoadListView extends ListView  {private final static int RELEASE_To_REFRESH = 0;// 下拉过程的状态值private final static int PULL_To_REFRESH = 1; // 从下拉返回到不刷新的状态值private final static int REFRESHING = 2;// 正在刷新的状态值private final static int DONE = 3;private final static int LOADING = 4;// 实际的padding的距离与界面上偏移距离的比例private final static int RATIO = 3;private LayoutInflater inflater;// ListView头部下拉刷新的布局private LinearLayout headerView;private TextView lvHeaderTipsTv;private TextView lvHeaderLastUpdatedTv;private ImageView lvHeaderArrowIv;private ProgressBar lvHeaderProgressBar;// 定义头部下拉刷新的布局的高度private int headerContentHeight;private RotateAnimation animation;private RotateAnimation reverseAnimation;private int startY;// 摁下时的Y值;private int state;// 当前的状态;private boolean isBack;// 用于保证startY的值在一个完整的touch事件中只被记录一次private boolean isRecored;private IReflashListener iReflashListener;//刷新数据的接口public boolean isRefreshable;// 是否能够刷新//底部加载布局public LinearLayout lvFooterLayout;private android.widget.LinearLayout.LayoutParams lvFooterProgressBarParams;private android.widget.LinearLayout.LayoutParams lvFooterTipLoadingParams;private android.widget.LinearLayout.LayoutParams lvFooterTipLoadedParams;private ProgressBar lvFooterProgressBar;private TextView lvTipLoading;    private TextView lvTipLoaded;   public boolean isFooterLoading;// 是否显示底部progressbarpublic RefreshAndLoadListView(Context context) {super(context);init(context);}public RefreshAndLoadListView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public RefreshAndLoadListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init(context);}private void init(Context context) {//头部加载inflater = LayoutInflater.from(context);headerView = (LinearLayout) inflater.inflate(R.layout.header_layout, null);lvHeaderTipsTv = (TextView) headerView.findViewById(R.id.lvHeaderTipsTv);lvHeaderLastUpdatedTv = (TextView) headerView.findViewById(R.id.lvHeaderLastUpdatedTv);lvHeaderArrowIv = (ImageView) headerView.findViewById(R.id.lvHeaderArrowIv);// 设置下拉刷新图标的最小高度和宽度lvHeaderArrowIv.setMinimumWidth(70);lvHeaderArrowIv.setMinimumHeight(50);lvHeaderProgressBar = (ProgressBar) headerView.findViewById(R.id.lvHeaderProgressBar);measureView(headerView);headerContentHeight = headerView.getMeasuredHeight();// 设置内边距,正好距离顶部为一个负的整个布局的高度,正好把头部隐藏headerView.setPadding(0, -1 * headerContentHeight, 0, 0);// 重绘一下headerView.invalidate();// 将下拉刷新的布局加入ListView的顶部addHeaderView(headerView, null, false);// 设置滚动监听事件//setOnScrollListener(this);// 设置旋转动画事件animation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator());animation.setDuration(250);animation.setFillAfter(true);reverseAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseAnimation.setInterpolator(new LinearInterpolator());reverseAnimation.setDuration(200);reverseAnimation.setFillAfter(true);// 一开始的状态就是下拉刷新完的状态,所以为DONEstate = DONE;// 是否正在刷新isRefreshable = false;//尾部加载//news_study_list.setAdapter(adapter);lvFooterLayout = new LinearLayout(context);lvFooterLayout.setMinimumHeight(60);lvFooterLayout.setGravity(Gravity.CENTER);lvFooterLayout.setOrientation(LinearLayout.HORIZONTAL);//尾部布局参数lvFooterProgressBarParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);lvFooterTipLoadingParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);lvFooterTipLoadedParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);/*** 向"加载项"布局中添加一个圆型进度条。*/lvFooterProgressBar = new ProgressBar(context);lvFooterProgressBar.setPadding(0, 0, 15, 0);/*** 向"加载项"布局中添加提示信息。*/lvTipLoading = new TextView(context);lvTipLoading.setText("加载中...");lvTipLoaded = new TextView(context);lvTipLoaded.setText("已加载全部");lvFooterLayout.addView(lvFooterProgressBar, lvFooterProgressBarParams);                 lvFooterLayout.addView(lvTipLoading, lvFooterTipLoadingParams); lvFooterLayout.addView(lvTipLoaded,lvFooterTipLoadedParams);/*** 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。*/addFooterView(lvFooterLayout);isFooterLoading=true;//刚开始显示底部progerssbarsetFooterView(context,isFooterLoading);}/*** 设置底部显示样式* @param context* @param isFooterLoading*/public void setFooterView(Context context,boolean isFooterLoading) {this.isFooterLoading=isFooterLoading;                                 if(isFooterLoading){lvFooterProgressBar.setVisibility(View.VISIBLE);    lvTipLoading.setVisibility(View.VISIBLE);   lvTipLoaded.setVisibility(View.GONE);                                           }else {         lvFooterProgressBar.setVisibility(View.GONE);   lvTipLoading.setVisibility(View.GONE);  lvTipLoaded.setVisibility(View.VISIBLE);    }}public void removeFooter(Context context){removeFooterView(lvFooterLayout);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (isRefreshable) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:if (!isRecored) {isRecored = true;startY = (int) ev.getY();// 手指按下时记录当前位置}break;case MotionEvent.ACTION_UP:if (state != REFRESHING && state != LOADING) {if (state == PULL_To_REFRESH) {state = DONE;changeHeaderViewByState();}if (state == RELEASE_To_REFRESH) {state = REFRESHING;changeHeaderViewByState();onLvRefresh();}}isRecored = false;isBack = false;break;case MotionEvent.ACTION_MOVE:int tempY = (int) ev.getY();if (!isRecored) {isRecored = true;startY = tempY;}if (state != REFRESHING && isRecored && state != LOADING) {// 保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动// 可以松手去刷新了                    if (state == RELEASE_To_REFRESH) {setSelection(0);// 往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步if (((tempY - startY) / RATIO < headerContentHeight)// 由松开刷新状态转变到下拉刷新状态&& (tempY - startY) > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();}// 一下子推到顶了else if (tempY - startY <= 0) {// 由松开刷新状态转变到done状态state = DONE;changeHeaderViewByState();}}// 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态if (state == PULL_To_REFRESH) {setSelection(0);// 下拉到可以进入RELEASE_TO_REFRESH的状态if ((tempY - startY) / RATIO >= headerContentHeight) {// 由done或者下拉刷新状态转变到松开刷新state = RELEASE_To_REFRESH;isBack = true;changeHeaderViewByState();}// 上推到顶了else if (tempY - startY <= 0) {// 由DOne或者下拉刷新状态转变到done状态state = DONE;changeHeaderViewByState();}}// done状态下if (state == DONE) {if (tempY - startY > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();}}// 更新headView的sizeif (state == PULL_To_REFRESH) {headerView.setPadding(0, -1 * headerContentHeight+ (tempY - startY) / RATIO, 0, 0);}// 更新headView的paddingTopif (state == RELEASE_To_REFRESH) {headerView.setPadding(0, (tempY - startY) / RATIO- headerContentHeight, 0, 0);}}break;default:break;}}return super.onTouchEvent(ev);}/** 当状态改变时候,调用该方法,以更新界面* */private void changeHeaderViewByState() {switch (state) {case RELEASE_To_REFRESH:lvHeaderArrowIv.setVisibility(View.VISIBLE);lvHeaderProgressBar.setVisibility(View.GONE);lvHeaderTipsTv.setVisibility(View.VISIBLE);lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);lvHeaderArrowIv.clearAnimation();// 清除动画lvHeaderArrowIv.startAnimation(animation);// 开始动画效果lvHeaderTipsTv.setText("松开刷新");break;case PULL_To_REFRESH:lvHeaderProgressBar.setVisibility(View.GONE);lvHeaderTipsTv.setVisibility(View.VISIBLE);lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);lvHeaderArrowIv.clearAnimation();lvHeaderArrowIv.setVisibility(View.VISIBLE);// 是由RELEASE_To_REFRESH状态转变来的if (isBack) {isBack = false;lvHeaderArrowIv.clearAnimation();lvHeaderArrowIv.startAnimation(reverseAnimation);lvHeaderTipsTv.setText("下拉刷新");} else {lvHeaderTipsTv.setText("下拉刷新");}break;case REFRESHING:headerView.setPadding(0, 0, 0, 0);lvHeaderProgressBar.setVisibility(View.VISIBLE);lvHeaderArrowIv.clearAnimation();lvHeaderArrowIv.setVisibility(View.GONE);lvHeaderTipsTv.setText("正在刷新...");lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);break;case DONE:headerView.setPadding(0, -1 * headerContentHeight, 0, 0);lvHeaderProgressBar.setVisibility(View.GONE);lvHeaderArrowIv.clearAnimation();lvHeaderArrowIv.setImageResource(R.drawable.pull_to_refresh_arrow);lvHeaderTipsTv.setText("下拉刷新");lvHeaderLastUpdatedTv.setVisibility(View.VISIBLE);break;}}/**此处是“估计”headView的width以及height* * @param child*/private void measureView(View child) {ViewGroup.LayoutParams params = child.getLayoutParams();if (params == null) {params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0,params.width);int lpHeight = params.height;int childHeightSpec;if (lpHeight > 0) {childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,MeasureSpec.EXACTLY);} else {childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);}child.measure(childWidthSpec, childHeightSpec);}public void setIRefreshListener(IReflashListener refreshListener) {this.iReflashListener = refreshListener;isRefreshable = true;}public interface IReflashListener {public void onRefresh();}public void onRefreshComplete() {state = DONE;lvHeaderLastUpdatedTv.setText("最近更新:" + new Date().toLocaleString());changeHeaderViewByState();}private void onLvRefresh() {if (iReflashListener != null) {iReflashListener.onRefresh();}}public void setAdapter(BaseAdapter adapter) {lvHeaderLastUpdatedTv.setText("最近更新:" + new Date().toLocaleString());super.setAdapter(adapter);}
}

2、实现下拉

public class NewsSystemListFragment extends BaseFragment implements IReflashListener,OnScrollListener
{private NewsSystemAdapter adapter;private ArrayList<SysNews> list;private ArrayList<BaseSysNews> baseSysNewsList;private SysNews sysNews;private RefreshAndLoadListView news_sys_listView;private Context context;private boolean isHave = true;public NewsSystemListFragment(ArrayList<SysNews> sysNewsList, Context context,NewsSystemAdapter adapter){this.adapter = adapter;this.context = context;this.list = sysNewsList;}public ArrayList<SysNews> getList(){return list;}public void setList(ArrayList<SysNews> list){this.list = list;}public NewsSystemListFragment(boolean flag){this.isHave = flag;}@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);}@Overridepublic void onLoadingFailed(RequestParam param, FailResponse failRresponse) {super.onLoadingFailed(param, failRresponse);news_sys_listView.onRefreshComplete();}@Overridepublic void onLoadingComplete(RequestParam param) {      super.onLoadingComplete(param);// 返回的是系统子新闻列表baseSysNewsList = ((GetSysNewsTitleBean) param.getResponse()).Data;news_sys_listView.onRefreshComplete();if (baseSysNewsList == null) {baseSysNewsList = new ArrayList<BaseSysNews>();}// 把系统子新闻列表放到系统新闻中if (baseSysNewsList.size() == 0) {sysNews = new SysNews();} else {sysNews = new SysNews(baseSysNewsList.get(0).SystemMessageId,baseSysNewsList.get(0).ApplyDate, baseSysNewsList.get(0).Title,baseSysNewsList.get(0).MessageType,baseSysNewsList.get(0).LogoImage);}int ListNum = baseSysNewsList.size();for (int i = 1; i < ListNum; i++) {sysNews.AppendNews(new BaseSysNews(baseSysNewsList.get(i).SystemMessageId, baseSysNewsList.get(i).ApplyDate, baseSysNewsList.get(i).Title,baseSysNewsList.get(i).MessageType,baseSysNewsList.get(i).LogoImage));}for (int i = ListNum; i < 6; i++) {sysNews.AppendNews(new BaseSysNews());}//      new Thread(){
//
//          @Override
//          public void run() {
//              // TODO Auto-generated method stub
//              super.run();//把系统子新闻列表以及系统新闻放入数据库SysNewsData.insertSysNew(context,baseSysNewsList,sysNews);// 从数据库获取数据((NewsActivity)context).setSysNewsData();
//          }
//
//      }.start();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){if (isHave){View view =inflater.inflate(R.layout.news_system_listfragment_listview, container, false);news_sys_listView=(RefreshAndLoadListView) view.findViewById(R.id.news_sys_list);news_sys_listView.setAdapter(adapter);news_sys_listView.setSelection(adapter.getCount());news_sys_listView.setIRefreshListener(this);news_sys_listView.setOnScrollListener(this);news_sys_listView.removeFooter(context);return view;}else{return null;}}@Overridepublic void onRefresh() {runApi(new GetSysNewsTitleRequest("1"));}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {if (firstVisibleItem == 0) {news_sys_listView.isRefreshable = true;} else {news_sys_listView.isRefreshable = false;}}}

3、实现下拉上滑

public class NewsStudyListFragment extends BaseFragment implements OnScrollListener,IReflashListener {private RefreshAndLoadListView news_study_list;private NewsStudyAdapter adapter;// 宝宝学习情况适配器       private ArrayList<StudyNews> list;private ArrayList<StudyNews> newList;private Context context;private boolean isHave = true;private int CurrentPage=1;private int mLastItem = 0;private int loadWay=0;//判断是上方加载还是下方加载private final int UPLOAD=1;private final int DOWNLOAD=2;public NewsStudyListFragment(ArrayList<StudyNews> studyNews,Context context, NewsStudyAdapter adapter) {this.adapter = adapter;this.context = context;this.list = studyNews;}public NewsStudyListFragment(boolean flag) {this.isHave = flag;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);       }@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {if (isHave) {View view = inflater.inflate(R.layout.news_study_listfragment_listview, container,false);news_study_list=(RefreshAndLoadListView) view.findViewById(R.id.news_study_list);/*** 组ListView组件设置Adapter,并设置滑动监听事件。*/            news_study_list.setAdapter(adapter);news_study_list.setOnScrollListener(this);news_study_list.setIRefreshListener(this);        return view;}else{return null;}}public ArrayList<StudyNews> getList() {return list;}public void setList(ArrayList<StudyNews> list) {this.list = list;if(list.size()<10)news_study_list.setFooterView(context, false);}@Overridepublic void onLoadingFailed(RequestParam param, FailResponse failRresponse) {super.onLoadingFailed(param, failRresponse);news_study_list.onRefreshComplete();news_study_list.setFooterView(context, false);}@Overridepublic void onLoadingComplete(RequestParam param) {super.onLoadingComplete(param);        if(loadWay==DOWNLOAD){newList = ((GetStudyNewsBean) param.getResponse()).Data;if (newList == null) {newList = new ArrayList<StudyNews>();}if(newList.size()<10){news_study_list.setFooterView(context, false);}list.addAll(newList);if (adapter == null) {adapter = new NewsStudyAdapter(context,list);} else {adapter.onDataChange(list);}if(list.size()==0){return;}}else if (loadWay==UPLOAD) {list = ((GetStudyNewsBean) param.getResponse()).Data;news_study_list.onRefreshComplete();if (list == null) {list = new ArrayList<StudyNews>();}                       if(list.size()<10){news_study_list.setFooterView(context, false);}else {news_study_list.setFooterView(context, true);}if (adapter == null) {adapter = new NewsStudyAdapter(context,list);} else {adapter.onDataChange(list);}if(list.size()==0){return;}            }}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {mLastItem = firstVisibleItem + visibleItemCount - 2;if (firstVisibleItem == 0) {news_study_list.isRefreshable = true;} else {news_study_list.isRefreshable = false;}}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {       /*** 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。*/       if (mLastItem == adapter.getCount() && (scrollState == OnScrollListener.SCROLL_STATE_IDLE)&& (news_study_list.isFooterLoading)&&(mLastItem>9)) {loadWay=DOWNLOAD;CurrentPage++;runApi(new GetStudyNewsRequest(MyApplication.key, "1",CurrentPage+"","10"));}}@Overridepublic void onRefresh() {String key=MyApplication.key;if (!"".equals(key) || null != key){loadWay=UPLOAD;CurrentPage=1;runApi(new GetStudyNewsRequest(key, "1", CurrentPage+"", "10"));news_study_list.setFooterView(context, true);}}
}

4、实现左拉删除
(1)自定义adapter

public class NewsBabyBuyAdapter extends BaseSwipeAdapter {private Context context;private ArrayList<BuyNews> list; private AddCarOrBag addCar;private ISwipeDel isd;public interface BuyFromNews {public void buy(String courseId, String price, String imageUrl,String courseName);}public NewsBabyBuyAdapter(Context context, ArrayList<BuyNews> buyNews) {this.context = context;this.list = buyNews;this.addCar = (AddCarOrBag) context;this.isd = (ISwipeDel) context;}public void onDataChange(ArrayList<BuyNews> list) {this.list = list;this.notifyDataSetChanged();}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic int getSwipeLayoutResourceId(int position) {return R.id.buyNewsSwipe;}@Overridepublic View generateView(final int position, ViewGroup parent) {View v = LayoutInflater.from(context).inflate(R.layout.news_babybuy_item, parent, false);final SwipeLayout swipeLayout = (SwipeLayout) v.findViewById(getSwipeLayoutResourceId(position));v.findViewById(R.id.ll_menu).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {isd.swipeToDel(position, swipeLayout);}});return v;}@Overridepublic void fillValues(final int position, View convertView) {        TextView content = (TextView) convertView.findViewById(R.id.news_baby_content);TextView date = (TextView) convertView.findViewById(R.id.news_baby_time);Button bag = (Button) convertView.findViewById(R.id.put_into_bag);content.setText(list.get(position).CourseName);SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");String t = format.format(new Date());date.setText(t);if ((MyApplication.isVip) || ("0".equals(list.get(position).Price))) {bag.setBackgroundResource(R.drawable.add_bag_default);bag.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// 会员进行加入书包操作addCar.addToBag(list.get(position).CourseId);}});} else {bag.setBackgroundResource(R.drawable.news_baby_buy);bag.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (NetWorkHelperUtil.isNetworkAvailable()) {addCar.addToCar(list.get(position).CourseId, position);} else {                      Toast.makeText(context, "网络连接异常,请稍后再试",Toast.LENGTH_SHORT).show();}}});}}}

(2)实现接口

public interface ISwipeDel {public void swipeToDel(int p, SwipeLayout swipeLayout);
}

自定义ListView下拉、上滑、左拉相关推荐

  1. android中上拉下滑布局,3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~...

    本文主要针对开发新手,手写实现一个最简单Android自定义listview下拉刷新和上拉加载demo. 不喜可喷,欢迎大佬留言指点. 效果图 一:编写需要在ListView中增加头加载的布局文件,与 ...

  2. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  3. Android模仿新浪微博(自定义ListView下拉刷新)

    自定义PullToRefreshListView继承ListView,在ListView头部添加一个下拉的头部布局.跟ListView用法完全一致. 该自定义Listview代码详解具体可参考: ht ...

  4. 小程序自定义navigationBar组件以及上滑修改navigationBar

    前言 navigationBar相信大家都不陌生把?今天我们就来说说自定义navigationBar,把它改变成我们想要的样子. 这次做一个全自定义的nav-bar,适用于基本上所有的场景,简单易懂, ...

  5. Android新浪微博分页加载,Android仿新浪微博自定义ListView下拉刷新(4)

    自定义PullToRefreshListView继承ListView,在ListView头部添加一个下拉的头部布局.跟ListView用法完全一致. 此处详细介绍Adapter的详细代码. 1.首先给 ...

  6. 承接上一篇:说说评论弹出editext,计算软键盘高度,使listview,recyclerview上滑指定高度

    最近项目中遇到问题:就是当软键盘弹出,editext输入时,遮挡listview,recyclerview条目,体验效果不好: 网上搜集,验证,找了个好的方法,希望能给大家项目中带来帮助: 通过监听e ...

  7. android组件的下拉回弹,转:Android可以下拉/上拉回弹的ListView原理

    可是为什么直接用ListView看不到下拉效果呢? 其实这是因为版权的问题,这个下拉的效果是苹果先出的,大家也都知道苹果跟谷歌的版权纠纷,所以谷歌虽然也能做到下拉,但没有明确给出来,只是做了一个动画效 ...

  8. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  9. Android实现ScrollView顶部布局上滑缩小,下滑恢复

    废话不多说,先上效果图: 代码实现也比较简易,我写了一个类继承了ScrollView,并重写onTouchEvent以支持头部布局的变化. 当然,这么做需要手动关联一下 头布局.图片. 上核心代码: ...

最新文章

  1. mysql 必须安装php_非root模式下安装mysql php小记
  2. 搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )
  3. 学php记不住函数,为什么都是记不住PHP 的函数名
  4. 实例对象的索引的方法
  5. gin mongodb restful api设计: 动态的patch接口
  6. 为什么wait和notify必须在同步方法或同步块中调用?
  7. T7315 yyy矩阵折叠(长)
  8. centos7轻松搭建文件服务器
  9. 重定向,用户管理,密码管理,权限管理
  10. 2018年视频云服务市场格局进入整合阶段,阿里云视频云位居市场竞争力领导者的位置
  11. 【Tip】那些“想当然”的记录
  12. 《从零开始的 RPG 游戏制作教程》第五期:制作物品和技能
  13. yii mysql gii_Yii 框架使用Gii生成代码操作示例
  14. 基础篇——人工智能相关方向学习路线指引
  15. 前端技巧总结---持续更新
  16. 打开 Office 出现配置进度然后报错“Microsoft Office 无法找到此应用程序的许可证,修复尝试失败或者已被取消”
  17. python3 中_pickle (cPickle) 序列化 (Serialization)
  18. 怎么压缩照片内存大小?网上如何压缩照片?
  19. 如何理解类与对象、继承
  20. 三、Git本地仓库基本操作——git仓库忽略跟踪文件

热门文章

  1. Flask之消息闪现
  2. 原生JS的HTTP请求相关知识
  3. 505 php 错误,【WordPress的505错误】
  4. brain dead_不死的“脑死”,大概是最有脑子的品牌
  5. 文字转语音效果哪家强?
  6. windows安装qt5的步骤
  7. 输入与输出后验与先验——学而不思则罔,思而不学则殆
  8. 开发工具|DingStudio1.1.0发布
  9. python ide安装_python IDE Eric6安装
  10. Sigmoid信念网络(SBN)