仿知乎客户端2.3.0首页的ActionBar位置刷新效果

主要使用的是这个第三方库:

https://github.com/chrisbanes/ActionBar-PullToRefresh

这里必须吐槽一下这个的文档,sample根本就是混乱的源头,最有用的说明竟然放在最后了,找了半天才点进去,然后发现竟然连每个参数属性指定的效果是什么都没说,真是体贴我啊,自己摸索?

要在 Android中用上述库,需要在引用依赖(最后一行):

废话少说,先来个效果图:

这里使用了今天学习的Toolbar的使用方法。

因为在官方文档中有说(我也是看了别人博客之后才知道的),在API21之后ActionBar中的Logo就被干掉了,默认不显示,即使设置了也显示不出来,虽然使用不使用Logo不是什么大事,但是Toolbar不知道是什么就是大事,具体博客自定google吧,我推荐我看的这篇:

http://blog.csdn.net/bbld_/article/details/41439715,感谢作者。

回到正题,要显示上述效果只要搞定一个关键点,那就是Theme,在styles中我按照ActionBar-PullToRefresh库的demo中的对于ScrollView的一个style来使用的

定义如下:

 1 <resources>
 2
 3     <!-- Base application theme. -->
 4     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
 5         <item name="colorPrimary">#4876FF</item>
 6         <item name="colorPrimaryDark">#3A5FCD</item>
 7         <item name="ptrHeaderStyle">@style/Widget.Custom.PtrHeader</item>
 8     </style>
 9
10     <style name="Theme.AppCompat.CustomPtrHeader" parent="Theme.AppCompat">
11         <item name="ptrHeaderStyle">@style/Widget.Custom.PtrHeader</item>
12     </style>
13
14     <style name="Widget.Custom.PtrHeader" parent="android:Widget">
15         <item name="ptrHeaderBackground">#ff4876ff</item>
16
17         <!-- This is commented out as you should not set this unless you know what you‘re doing -->
18         <item name="ptrHeaderHeight">?attr/actionBarSize</item>
19
20         <item name="ptrHeaderTitleTextAppearance">@style/TextAppearance.Custom.PtrHeader.Title</item>
21         <item name="ptrProgressBarStyle">inside</item>
22         <item name="ptrProgressBarColor">#fffaff23</item>
23
24         <item name="ptrPullText">下拉刷新</item>
25         <item name="ptrRefreshingText">正在刷新</item>
26     </style>
27
28     <style name="TextAppearance.Custom.PtrHeader.Title"
29            parent="android:TextAppearance.Large.Inverse">
30         <item name="android:textSize">20dp</item>
31     </style>
32 </resources>

看看这些ptrHeader关键字的属性,这就是实现上述效果最重要的部分,下方有绿色注释的部分的那个是我见过最好玩的注释了,这也是实现上述效果最重要的一个属性,因为如果不设置的话,我发现下拉的时候,那个HeaderView是不能将ToolBar完全覆盖的,因此会有很不好的效果。

对于在代码中的使用,例子如下:

 1     private PullToRefreshLayout mPullToRefreshLayout;
 2
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.imitate_main_layout);
 7
 8         mPullToRefreshLayout = (PullToRefreshLayout)findViewById(R.id.ptr_layout);
 9
10         ActionBarPullToRefresh.from(this)
11                 .allChildrenArePullable()
12                 .listener(new OnRefreshListener() {
13                     @Override
14                     public void onRefreshStarted(View view) {
15                         new PullToRefreshTask().execute();
16                     }
17                 })
18                 .setup(mPullToRefreshLayout);
19     }

为了在完成的时候让进度条消失,调用

mPullToRefreshLayout.setRefreshComplete();

整个类的代码是:

  1 package com.lhyz.examples.compatactionbar;
  2
  3 import android.os.AsyncTask;
  4 import android.os.Bundle;
  5 import android.support.v4.widget.DrawerLayout;
  6 import android.support.v7.app.ActionBarActivity;
  7 import android.support.v7.app.ActionBarDrawerToggle;
  8 import android.support.v7.widget.Toolbar;
  9 import android.view.Menu;
 10 import android.view.MenuItem;
 11 import android.view.View;
 12 import android.view.ViewGroup;
 13 import android.widget.BaseAdapter;
 14 import android.widget.ListView;
 15 import android.widget.TextView;
 16
 17 import com.lhyz.examples.data.Cheeses;
 18
 19 import java.util.ArrayList;
 20
 21 import uk.co.senab.actionbarpulltorefresh.extras.actionbarcompat.PullToRefreshLayout;
 22 import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh;
 23 import uk.co.senab.actionbarpulltorefresh.library.listeners.OnRefreshListener;
 24
 25 public class MainActivity extends ActionBarActivity {
 26
 27     private ListView mListView;
 28
 29     private Toolbar mToolbar;
 30     private DrawerLayout mDrawerLayout;
 31     private ActionBarDrawerToggle mActionBarDrawerToggle;
 32
 33     private PullToRefreshLayout mPullToRefreshLayout;
 34
 35     @Override
 36     protected void onCreate(Bundle savedInstanceState) {
 37         super.onCreate(savedInstanceState);
 38         setContentView(R.layout.imitate_main_layout);
 39
 40         mToolbar = (Toolbar)findViewById(R.id.main_toolbar);
 41         mToolbar.setTitle("知也");
 42         mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
 43             @Override
 44             public boolean onMenuItemClick(MenuItem menuItem) {
 45                 return false;
 46             }
 47         });
 48         setSupportActionBar(mToolbar);
 49         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 50
 51         mDrawerLayout = (DrawerLayout)findViewById(R.id.main_drawer);
 52         mActionBarDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,mToolbar,R.string.drawer_open,R.string.drawer_close);
 53         mActionBarDrawerToggle.syncState();
 54         mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
 55
 56         mListView = (ListView)findViewById(R.id.list_view);
 57         mListView.setAdapter(new ListAdapter(Cheeses.randomList(30)));
 58
 59         mPullToRefreshLayout = (PullToRefreshLayout)findViewById(R.id.ptr_layout);
 60
 61         ActionBarPullToRefresh.from(this)
 62                 .allChildrenArePullable()
 63                 .listener(new OnRefreshListener() {
 64                     @Override
 65                     public void onRefreshStarted(View view) {
 66                         new PullToRefreshTask().execute();
 67                     }
 68                 })
 69                 .setup(mPullToRefreshLayout);
 70     }
 71
 72     @Override
 73     public boolean onCreateOptionsMenu(Menu menu) {
 74         getMenuInflater().inflate(R.menu.imitate_menu,menu);
 75         return true;
 76     }
 77
 78     private class PullToRefreshTask extends AsyncTask<Void,Void,ArrayList<String>>{
 79
 80         @Override
 81         protected ArrayList<String> doInBackground(Void... params) {
 82             try{
 83                 Thread.sleep(5000);
 84             }catch (InterruptedException e){
 85                 e.printStackTrace();
 86             }
 87
 88             return Cheeses.randomList(30);
 89         }
 90
 91         @Override
 92         protected void onPostExecute(ArrayList<String> arrayList) {
 93             mListView.setAdapter(new ListAdapter(arrayList));
 94             mPullToRefreshLayout.setRefreshComplete();
 95             super.onPostExecute(arrayList);
 96         }
 97     }
 98
 99     private class ListAdapter extends BaseAdapter{
100         private ArrayList<String> mData;
101
102         private ListAdapter(ArrayList<String> data) {
103             mData = data;
104         }
105
106         @Override
107         public int getCount() {
108             return mData.size();
109         }
110
111         @Override
112         public String getItem(int position) {
113             return mData.get(position);
114         }
115
116         @Override
117         public long getItemId(int position) {
118             return mData.get(position).hashCode();
119         }
120
121         @Override
122         public View getView(int position, View convertView, ViewGroup parent) {
123             if(convertView == null){
124                 convertView = getLayoutInflater().inflate(R.layout.item,parent,false);
125             }
126
127             TextView textView = (TextView)convertView.findViewById(R.id.text);
128
129             textView.setText(getItem(position));
130
131             return convertView;
132         }
133     }
134 }

代码不多,都是在上述我说过的博客和文档,sample中学到的,至于Cheeses,那个是google官方sample,UI下的swiperefreshlayout中使用的数据源,SwipeRefreshLayout也是知乎日报默认的下拉刷新控件。

OK,That‘s All

时间: 2024-10-13 10:23:29

仿知乎客户端2.3.0首页的ActionBar位置刷新效果的相关文章

仿百度壁纸客户端(三)——首页单向,双向事件冲突处理,壁纸列表的实现

仿百度壁纸客户端(三)--首页单向,双向事件冲突处理,壁纸列表的实现 上回把广告轮播图给实现了,今天就来把主页的大部分功能给实现了 一.ScrollView和ViewPager滑动事件冲突的解决办法 我们仔细想想,我们的主页架构,首先他是上下滑动的,所以这样要一个ScrollView,然后就是轮播图和其他内容了,这样的话,上下滑动有事件,轮播图也有事件,我们先看下xml的实现原理 home_fragment_xml <?xml version="1.0" encoding=&qu

仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化

仿百度壁纸客户端(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端(二)--主页自定义ViewPager广告定时轮播图 仿百度壁纸客户端(三)--首页单向,双向事件冲突处理,壁纸列表的实现 仿百度壁纸客户端(四)--自定义上拉加载实现精选壁纸墙 仿百度壁纸客户端(五)--实现搜索动画GestureDetector手势识别,动态更新搜索关键字 仿百度壁纸客

#仿知乎安卓客户端滑动删除撤销ListView

标签(空格分隔): Android 新版的知乎安卓客户端有一个有趣的功能,就是在一个item里,向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了,放开手指就是删除,删除后还可以撤销,第一次看见这个功能觉得很有意思,用了几天业余时间,我仿造里一个,效果如下: 那下面就来想想看怎么实现的,大概可以先分解为三部分: 手指滑动删除item 删除item后的撤销功能 滑动时的效果处理 提醒一下如果你对scroller不熟悉,可以先看一下scroller实现原理 先来看最主要的类Cus

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

仿知乎日报学习笔记与优化

仿知乎日报学习笔记与优化项目原地址(有些小BUG):单页网页应用:https://github.com/pomelo-chuan/Zhihu-Daily-Vue.js知乎日报api查询:https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90如果想看完整的API的json数据的话,推荐使用sublime,网上搜索sublime jso

仿Bilibili iOS客户端 练习案例源码

仿Bilibili iOS客户端 练习启动页 源码下载:http://code.662p.com/view/14534.html 首页    分区 发现 我的 视频信息 普通/直播 视频播放 详细说明:http://ios.662p.com/thread-3121-1-1.html

高仿淘宝客户端

高仿淘宝客户端 仿淘宝安卓客户端的demo源码,主要实现了:商品的基本展示.宝贝详情,图片展示的放大缩小功能.界面之间切换的动画.购物车多项删除.弹窗的动画效果.首页广告的轮播效果.获得本机具有传感器的列表.listView的上拉刷新,下拉加载功能.二维码扫描.刮刮乐等功能和效果. 下载地址:http://www.devstore.cn/code/info/925.html 运行截图:    

Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻客户端Tab标签的功能,ActionBarSherlock是在3.0以下的机器支持ActionBar的功能,有兴趣的可以看看开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端,今天用到的是JakeWharton的另一开源控件ViewPageIndicator,ViewPager想必大家都知道,Indicator指示器的意思,所以ViewPageIndica

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么