SwipeRefreshView & RecyclerView 控件使用小结

来源:互联网 发布:linux 安装php环境 编辑:程序博客网 时间:2024/05/02 00:03

SwipeRefreshView

App基本都有下拉刷新的功能,以前基本都使用XListView或者自己写一个下拉刷新,近期Google提供了一个官方的下拉刷新控件SwipeRefreshLayout,我感觉还不错啊,见惯了传统的下拉刷新,这个反而给人耳目一新的感觉(貌似知乎的APP已经使用这种下拉刷新了)。

Google也在官方网站给出了V4的兼容包:


顺便看一眼API呗:


和XlistView差不多,还是很方便使用的,大概就这4个常用的方法,下面贴个简单的例子。

1、布局文件:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent" >  
  4.   
  5.     <android.support.v4.widget.SwipeRefreshLayout  
  6.         android:id="@+id/id_swipe_ly"  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="match_parent" >  
  9.   
  10.         <ListView  
  11.             android:id="@+id/id_listview"  
  12.             android:layout_width="match_parent"  
  13.             android:layout_height="match_parent" >  
  14.         </ListView>  
  15.     </android.support.v4.widget.SwipeRefreshLayout>  
  16.   
  17. </RelativeLayout>  

2、MainActivty:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.zhy.swiperefreshlayoutdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Arrays;  
  5. import java.util.List;  
  6.   
  7. import android.annotation.SuppressLint;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.os.Handler;  
  11. import android.support.v4.widget.SwipeRefreshLayout;  
  12. import android.util.Log;  
  13. import android.widget.ArrayAdapter;  
  14. import android.widget.ListView;  
  15.   
  16. public class MainActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener  
  17. {  
  18.   
  19.     private static final int REFRESH_COMPLETE = 0X110;  
  20.     private SwipeRefreshLayout mSwipeLayout;  
  21.     private ListView mListView;  
  22.     private ArrayAdapter<String> mAdapter;  
  23.     private List<String> mDatas = new ArrayList<String>(Arrays.asList("Java""Javascript""C++""Ruby""Json",  
  24.             "HTML"));  
  25.   
  26.     private Handler mHandler = new Handler()  
  27.     {  
  28.         public void handleMessage(android.os.Message msg)  
  29.         {  
  30.             switch (msg.what)  
  31.             {  
  32.             case REFRESH_COMPLETE:  
  33.                 mDatas.addAll(Arrays.asList("Lucene""Canvas""Bitmap"));  
  34.                 mAdapter.notifyDataSetChanged();  
  35.                 mSwipeLayout.setRefreshing(false);  
  36.                 break;  
  37.   
  38.             }  
  39.         };  
  40.     };  
  41.   
  42.     @SuppressLint("InlinedApi")  
  43.     protected void onCreate(Bundle savedInstanceState)  
  44.     {  
  45.         super.onCreate(savedInstanceState);  
  46.         setContentView(R.layout.activity_main);  
  47.   
  48.         mListView = (ListView) findViewById(R.id.id_listview);  
  49.         mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.id_swipe_ly);  
  50.   
  51.         mSwipeLayout.setOnRefreshListener(this);  
  52.         mSwipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light,  
  53.                 android.R.color.holo_orange_light, android.R.color.holo_red_light);  
  54.         mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);  
  55.         mListView.setAdapter(mAdapter);  
  56.   
  57.     }  
  58.   
  59.     public void onRefresh()  
  60.     {  
  61.         // Log.e("xxx", Thread.currentThread().getName());  
  62.         // UI Thread  
  63.   
  64.         mHandler.sendEmptyMessageDelayed(REFRESH_COMPLETE, 2000);  
  65.   
  66.     }  
  67. }  

好了,结束,我感觉效果挺好看的,不妨试试。

原文:http://blog.csdn.net/lmj623565791/article/details/24521483/


RecyclerView

RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 
据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。

那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

  • 你想要控制其显示的方式,请通过布局管理器LayoutManager
  • 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
  • 你想要控制Item增删的动画,请通过ItemAnimator
  • 你想要控制点击、长按事件,请自己写(擦,这点尼玛。)

基本使用

鉴于我们对于ListView的使用特别的熟悉,对比下RecyclerView的使用代码:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">mRecyclerView = findView(R.id.id_recyclerview);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置布局管理器</span>mRecyclerView.setLayoutManager(layout);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置adapter</span>mRecyclerView.setAdapter(adapter)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置Item增加、移除动画</span>mRecyclerView.setItemAnimator(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DefaultItemAnimator());<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//添加分割线</span>mRecyclerView.addItemDecoration(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DividerItemDecoration(                getActivity(), DividerItemDecoration.HORIZONTAL_LIST));</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

ok,相比较于ListView的代码,ListView可能只需要去设置一个adapter就能正常使用了。而RecyclerView基本需要上面一系列的步骤,那么为什么会添加这么多的步骤呢?

那么就必须解释下RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。

RecyclerView.LayoutManager,这是一个抽象类,好在系统提供了3个实现类:

  1. LinearLayoutManager 现行管理器,支持横向、纵向。
  2. GridLayoutManager 网格布局管理器
  3. StaggeredGridLayoutManager 瀑布就式布局管理器

Click and LongClick

不过一个挺郁闷的地方就是,系统没有提供ClickListener和LongClickListener。 
不过我们也可以自己去添加,只是会多了些代码而已。 
实现的方式比较多,你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 
当然你也可以通过adapter中自己去提供回调,这里我们选择后者,前者的方式,大家有兴趣自己去实现。

那么代码也比较简单:

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{//...    public interface OnItemClickLitener    {        void onItemClick(View view, int position);        void onItemLongClick(View view , int position);    }    private OnItemClickLitener mOnItemClickLitener;    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)    {        this.mOnItemClickLitener = mOnItemClickLitener;    }    @Override    public void onBindViewHolder(final MyViewHolder holder, final int position)    {        holder.tv.setText(mDatas.get(position));        // 如果设置了回调,则设置点击事件        if (mOnItemClickLitener != null)        {            holder.itemView.setOnClickListener(new OnClickListener()            {                @Override                public void onClick(View v)                {                    int pos = holder.getLayoutPosition();                    mOnItemClickLitener.onItemClick(holder.itemView, pos);                }            });            holder.itemView.setOnLongClickListener(new OnLongClickListener()            {                @Override                public boolean onLongClick(View v)                {                    int pos = holder.getLayoutPosition();                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);                    return false;                }            });        }    }//...}
adapter中自己定义了个接口,然后在onBindViewHolder中去为holder.itemView去设置相应 

的监听最后回调我们设置的监听。

最后别忘了给item添加一个drawable:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:state_pressed="true" android:drawable="@color/color_item_press"></item>    <item android:drawable="@color/color_item_normal"></item></selector>

Activity中去设置监听:

 mAdapter.setOnItemClickLitener(new OnItemClickLitener()        {            @Override            public void onItemClick(View view, int position)            {                Toast.makeText(HomeActivity.this, position + " click",                        Toast.LENGTH_SHORT).show();            }            @Override            public void onItemLongClick(View view, int position)            {                Toast.makeText(HomeActivity.this, position + " long click",                        Toast.LENGTH_SHORT).show();                        mAdapter.removeData(position);            }        });
测试效果:

ok,到此我们基本介绍了RecylerView常见用法,包含了:

  • 系统提供了几种LayoutManager的使用;
  • 如何通过自定义ItemDecoration去设置分割线,或者一些你想作为分隔的drawable,注意这里 
    巧妙的使用了系统的listDivider属性,你可以尝试添加使用divider和dividerHeight属性。
  • 如何使用ItemAnimator为RecylerView去添加Item移除、添加的动画效果。
  • 介绍了如何添加ItemClickListener与ItemLongClickListener。

可以看到RecyclerView可以实现:

  • ListView的功能
  • GridView的功能
  • 横向ListView的功能,参考Android 自定义RecyclerView 实现真正的Gallery效果
  • 横向ScrollView的功能
  • 瀑布流效果
  • 便于添加Item增加和移除动画

整个体验下来,感觉这种插拔式的设计太棒了,如果系统再能提供一些常用的分隔符,多添加些动画效果就更好了。

通过简单改变下LayoutManager,就可以产生不同的效果,那么我们可以根据手机屏幕的宽度去动态设置LayoutManager,屏幕宽度一般的,显示为ListView;宽度稍大的显示两列的GridView或者瀑布流(或者横纵屏幕切换时变化,有点意思~);显示的列数和宽度成正比。甚至某些特殊屏幕,让其横向滑动~~再选择一个nice的动画效果,相信这种插件式的编码体验一定会让你迅速爱上RecyclerView。

参考资料

自定义XRecyclerView可添头尾布局支持下拉刷新加载更多 

万能刷新加载控件

Android 自定义RecyclerView 实现真正的Gallery效果

A First Glance at Android’s RecyclerView

https://github.com/gabrielemariotti/RecyclerViewItemAnimators

DividerItemDecoration

原文:http://blog.csdn.net/lmj623565791/article/details/45059587






0 0
原创粉丝点击