模板代码 - 列表和下拉刷新

*:first-child {
margin-top: 0 !important;
}

body>*:last-child {
margin-bottom: 0 !important;
}

/* BLOCKS
=============================================================================*/

p, blockquote, ul, ol, dl, table, pre {
margin: 15px 0;
}

/* HEADERS
=============================================================================*/

h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
}

h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
font-size: inherit;
}

h1 {
font-size: 28px;
color: #000;
}

h2 {
font-size: 24px;
border-bottom: 1px solid #ccc;
color: #000;
}

h3 {
font-size: 18px;
}

h4 {
font-size: 16px;
}

h5 {
font-size: 14px;
}

h6 {
color: #777;
font-size: 14px;
}

body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}

h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}

/* LINKS
=============================================================================*/

a {
color: #4183C4;
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

/* LISTS
=============================================================================*/

ul, ol {
padding-left: 30px;
}

ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}

ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}

dl {
padding: 0;
}

dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}

dl dt:first-child {
padding: 0;
}

dl dt>:first-child {
margin-top: 0px;
}

dl dt>:last-child {
margin-bottom: 0px;
}

dl dd {
margin: 0 0 15px;
padding: 0 15px;
}

dl dd>:first-child {
margin-top: 0px;
}

dl dd>:last-child {
margin-bottom: 0px;
}

/* CODE
=============================================================================*/

pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}

code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}

pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}

pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}

pre code, pre tt {
background-color: transparent;
border: none;
}

kbd {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
background-color: #DDDDDD;
background-image: linear-gradient(#F1F1F1, #DDDDDD);
background-repeat: repeat-x;
border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
border-image: none;
border-radius: 2px 2px 2px 2px;
border-style: solid;
border-width: 1px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
line-height: 10px;
padding: 1px 4px;
}

/* QUOTES
=============================================================================*/

blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}

blockquote>:first-child {
margin-top: 0px;
}

blockquote>:last-child {
margin-bottom: 0px;
}

/* HORIZONTAL RULES
=============================================================================*/

hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}

/* TABLES
=============================================================================*/

table th {
font-weight: bold;
}

table th, table td {
border: 1px solid #ccc;
padding: 6px 13px;
}

table tr {
border-top: 1px solid #ccc;
background-color: #fff;
}

table tr:nth-child(2n) {
background-color: #f8f8f8;
}

/* IMAGES
=============================================================================*/

img {
max-width: 100%
}
-->

模板代码 - 列表和下拉刷新

  手机应用一个常见的界面模式就是:顶部的ActionBar + TabStrip导航,中间的ListView,可以下拉刷新或者是底部的加载更多。通常ListView都需要是显示多种类型的条目。

ActionBar-ViewPager-Fragment

  • 自定义一个带有ActionBar的主题:这样既可以获得ActionBar效果,又可以自己调整ActionBar的显示,如背景和字体等。下面主要是重新指定了tab_indicator。

    //在values/style.xml里:actionbar_tab_indicator的内容省略,官方文档有,很罗嗦。
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>
    </style>
    
    <!-- ActionBar tabs styles -->
    <style name="MyActionBarTabs"
           parent="@style/android:Widget.Holo.ActionBar.TabView">
        <!-- tab indicator -->
        <item name="android:background">@drawable/actionbar_tab_indicator</item>
    </style>
    
  • 让Activity继承FragmentActivity,定义一个继承自FragmentStatePagerAdapter的子类——MyPagerAdapter,活动布局中放置一个ViewPager填充整个界面。Activity.onCreate方法里为ActionBar设置属性:
    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);
    
    //FragmentStatePagerAdapter的public Fragment getItem(int position)等相关方法正是配合ViewPager来完成
    //整个界面里切换Fragment的功能。它一直保持正在显示的,和左右(如果有)2个Fragment实例。
    
    //关联viewPager和FragmentStatePagerAdapter实例
    viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    
  • 在布局文件,ViewPager内放置android.support.v4.view.PagerTabStrip控件,这样可以显示ActionBar的tabs为特殊的样式,就是一直显示“左、中、右” 3个tab指示器,左右滑动ViewPager切换Fragment时,或者点击tab标签时左右滚动来显示更多其它的tab。(以后上图。。。)

ListView显示多种类型的条目

  ListView支持显示多种类型的条目,并且可以同时复用不同条目的view。假设我们使用ListView显示一个下载应用的列表界面,在ListView的底部显示“加载更多”这样的按钮,那么就是让ListView同时显示2种类型的条目。

  ListView的getView方法正是我们为ListView提供要显示条目的地方,为了便于为普通的条目对应的view对象添加更多的控制,可以定义ViewHolder来组合View,并负责它的创建和状态控制。

  • 为显示的“应用信息”列表条目定义AppInfoViewHolder,它包含一个name和icon,布局文件item_appinfo是简单的ImageView和TextView,其ViewHolder定义如下:

    class AppInfoViewHolder{
        ImageView icon;
        TextView name;
        View itemView;
    
        public AppInfoViewHolder(){
            itemView = View.inflate(AppHelper.getContext(), R.layout.item_appinfo,null);
            icon = (ImageView)itemView.findViewById(R.id.appIcon);
            name = (TextView)itemView.findViewById(R.id.appName);
            //关联当前Holder和View
            itemView.setTag(this);
        }
    
        public void setViewData(AppInfo info){
            icon.setImageResource(info.getIconResId());
            name.setText(info.getName());
        }
    
        public View getView(){
            return itemView;
        }
    }
    
  • 之后定义“加载更多”的LoadMoreViewHolder:
    public class LoadMoreViewHolder {   
    
        private View contentView;
        private View loadMore;
        private View loading;
        private Button bt_loadMore;
    
        OnLoadMoreExecute loadMoreListener;
    
        public LoadMoreViewHolder{
            contentView = View.inflate(UIUtils.getContext(), R.layout.load_more, null);
            loadMore = contentView.findViewById(R.id.view_load_more);
            loading = contentView.findViewById(R.id.view_loading);
            bt_loadMore =  (Button) contentView.findViewById(R.id.bt_load_more);
            //关联当前Holder和View
            contentView.setTag(this);
            showLoadMore();
        }
    
        public interface OnLoadMoreExecute{
            void loadMore(LoadMoreHolder holder);
        }           
    
        //设置“加载更多”的业务逻辑
        public void setOnLoadMoreListener(OnLoadMoreExecute action){
            loadMoreListener = action;
            if(loadMoreListener != null ){
                bt_loadMore.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        loadMoreListener.loadMore(LoadMoreViewHolder.this);
                    }
                });
            }
        }       
    
        public void showLoading(){
            loading.setVisibility(View.VISIBLE);
            loadMore.setVisibility(View.INVISIBLE);
        }
    
        public void showLoadMore(){
            loadMore.setVisibility(View.VISIBLE);
            loading.setVisibility(View.INVISIBLE);
        }
    
        public View getView(){
            return contentView;
        }
    }
    

      LoadMoreViewHolder提供加载更多加载中两种界面,当数据加载失败或者没有更多数据时,可以使用Toast进行界面提示,当然也可以动态改变“加载更多”按钮的显示文本。

      上面的LoadMoreViewHolder显示了使用ViewHolder来管理每个列表条目对应的View是非常方便的,这样可以让ListView的每个条目的创建、状态修改的代码都集中在一个类中,如果不是使用ViewHolder来组合View,那么对View状态的修改的代码就很容易分散地复杂起来。

  • ListView的多条目类型复用,主要是getView、getViewTypeCount、getItemViewType和getCount搭配使用。
    public class AppInfoAdapter extends BaseAdapter {
    
        List<AppInfo> infos;
        private final int ITEMTYPE_APP = 0;//条目类型对应的值范围是:0 ~ getViewTypeCount()-1
        private final int ITEMTYPE_MORE = 1;
    
        //显示的条目总数
        @Override
        public int getCount() {
            return infos.size() + 1;
        }
    
        //position处的条目的类型,条目类型对应的值范围是:0 ~ getViewTypeCount()-1
        @Override
        public int getItemViewType(int position) {
            if(position == infos.size()){
                return ITEMTYPE_MORE;
            }else{
                return ITEMTYPE_APP;
            }
        }
    
        //显示条目的类型数
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    
        //根据position和convertView来创建或复用条目
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            int viewType = getItemViewType(position);
            View view = null;
            switch (viewType) {
            case ITEMTYPE_APP:
                AppInfoViewHolder appHolder = null;
                if(convertView == null){
                    appHolder = new AppInfoViewHolder();
                }else{
                    appHolder = (AppInfoViewHolder) view.getTag();
                }
                appHolder.setViewData(infos.get(position));
                view = appHolder.getView();
                break;
            case ITEMTYPE_MORE:
                if(convertView == null){
                    LoadMoreViewHolder moreHolder = new LoadMoreViewHolder();
                    moreHolder.setOnLoadMoreListener(new OnLoadMoreExecute(){
                        @Override
                        public void loadMore(LoadMoreViewHolder holder){
                            asyncLoadMoreData(holder);
                        }
                    });
                    view = moreHolder.getView();
                }else{
                    view = convertView;
                }
                break;
            }
            return view;
        }
    
        private void asyncLoadMoreData(LoadMoreViewHolder holder){
            holder.showLoading();
            new Thread(){
                @Override
                public void run() {
                    final List<AppInfo> newData = new AppInfoDao.getPageData(2);
                    UIHelper.runOnUiThread(new Runnable(){
                        @Override
                        public void run() {
                            if(newData == null){
                                Toast.makeText(AppHelper.getContext(), "获取失败,稍后重试。", Toast.LENGTH_SHORT).show();
                            }else if(newData.size() == 0){
                                Toast.makeText(AppHelper.getContext(), "没数据了,稍后重试。", Toast.LENGTH_SHORT).show();
                            }else{
                                infos.addAll(newData);
                                notifyDataSetChanged();
                            }
                            holder.showLoadMore();
                        }
                    });
                }
            }.start();
        }
    }
    

  ListView可以添加多种类型的显示条目,常见的有顶部的轮播图片,顶部下拉刷新,以及底部的加载更多等等。借助ViewHolder来管理ListView要显示的条目,代码更容易集中,可以针对不同的条目设计不同的Holder类。

时间: 2024-10-26 16:16:14

模板代码 - 列表和下拉刷新的相关文章

Android实现RecyclerView自定义列表、点击事件以及下拉刷新

Android使用RecyclerView 1. 什么是RecyclerView RecyclerView 是 Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活. 简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持. 2.

android开发(3):列表listview的实现 | 下拉刷新

APP里面的列表太常用了,系统提供的listview或grideview可以做到.另外,我希望这个列表能够下拉时触发刷新,于是考虑使用封装了这个功能的开源项目,这里介绍这个: https://github.com/Yalantis/Phoenix 这是一个支持下拉刷新的控件,里面包括了ListView. (1)引入下拉刷新库 同样,先引入这个库,在app/build.gradle的dependencies中增加一行: implementation 'com.yalantis:phoenix:1.

vue之better-scroll的封装,包含下拉刷新,上拉加载功能及UI(核心为借鉴,我仅仅是给轮子套上了外胎...)

先发原文作者.地址等信息.我把内容全部搬过来了,也可以去看原文.内容绝对是满满的干货,给原作者点赞!(我添加的内容在转载过来的后面,内容不多) 作者: ustbhuangyi 链接:http://www.imooc.com/article/18232 来源:慕课网 在我们日常的移动端项目开发中,处理滚动列表是再常见不过的需求了,以滴滴为例,可以是这样竖向滚动的列表,如图所示: 也可以是横向滚动的导航栏,如图所示: 可以打开"微信 -> 钱包->滴滴出行"体验效果. 我们在实

十分钟实现ListView下拉刷新上滑加载更多

说到ListView下拉刷新几乎每个APP都会用到,所以ListView下拉刷新是很重要的,就像ListView优化一样是你必会的东西. ListView实现下拉刷新如果我们开发人员自己编写相对来说比较费事的,当我们使用第三方库之后我们再来开发这个功能就会省事很多.相比与自己实现可以少编写不少代码,Android-PullToRefresh库可以轻松实现ListView的下拉刷新功能. 要使用Android—PullToRefesh库对ListView实现下拉刷新要经过以下几个步骤: 1.下载A

Android自定义下拉刷新动画--仿百度外卖下拉刷新

好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错.好了废话不多说了,开始我们今天的主题吧.现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前两天订饭的时候不经意间看到了"百度外卖"的下拉刷新,今天的主题就是它–自定义下拉刷新动画. 看一下实现效果吧: 动画 我们先来看看Android中的动画吧: Android中的动画分为三种: Tween动画,这一类的动画提供了旋转.平移.缩放等效果. Alpha – 淡入淡出 Scale

iOS_UITableView上拉加载,下拉刷新

转自:http://blog.csdn.net/hmt20130412/article/details/32695305 很多App中,新闻或者展示类都存在下拉刷新和上拉加载的效果,网上提供了实现这种效果的第三方类(详情请见MJRefresh和EGOTableViewPullRefresh),用起来很方便,但是闲暇之余,我们可以思考下,这种效果实现的原理是什么,我以前说过,只要是动画都是骗人的,只要不是硬件问题大部分效果都能在系统UI的基础上做出来. @下面是关键代码分析: 1 // 下拉刷新的

Android下拉刷新,上拉加载。

原文:Android下拉刷新,上拉加载. 源代码下载地址:http://www.zuidaima.com/share/1550463747574784.htm Android列表的下拉刷新,上拉加载. 源码截图 package com.zuidaima.stay.pull.lib; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import

RecyclerView 上拉加载下拉刷新

<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_swipe" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_r

android 下拉刷新/上拉加载更多【pull-to-refresh】

这两天在做一个功能,需要用到"下拉刷新和上拉加载更多"这样的功能,开始的时候以为都是自己用控件加以控件来完成的,后来,在网上找了好长时间,发现直接可以用别人的现在的 library . 引用别人的library后直接就可以用的,只是注意一些细节就可以了. 我用的是pull to refresh (很多人都说这个比较好点). 它支持多种常用的需要刷新的View类型,如:ListView.ExpandableListView.GridView.WebView等.这里就给个下载地址吧:htt