首页 > 其他 > 详细

RecyclerView 分组悬停

时间:2016-08-04 17:47:53      阅读:1028      评论:0      收藏:0      [点我收藏+]

 

timehop/sticky-headers-recyclerview: [UNMAINTAINED] Sticky Headers decorator for Android‘s RecyclerView  

https://github.com/timehop/sticky-headers-recyclerview

技术分享

 

这个库好在对adapter改动小,只需要实现就行了

这里用 一个省份城市api 测试 http://apistore.baidu.com/apiworks/servicedetail/990.html

取以下四种数据   并添加一个 string类型的 type

"province": "上海",
"region": "华东地区",
"x": 121.473,
"y": 31.2317

 

CityInfo  是adapter 需要的数据

技术分享
 1 public class CityInfo {
 2     /*
 3     华东地区  a
 4     华北地区  b
 5     华南地区  c
 6     华中地区  d
 7 
 8     东北地区  e
 9     西北地区  f
10     西南地区  g
11 
12     台港澳地区 h
13      */
14 
15     private String province;
16     private String region;
17     private String type;
18     private double x;
19     private double y;
20 
21     public String getType() {
22         return type;
23     }
24 
25     public void setType(String type) {
26         this.type = type;
27     }
28 
29     public String getProvince() {
30         return province;
31     }
32 
33     public void setProvince(String province) {
34         this.province = province;
35     }
36 
37     public String getRegion() {
38         return region;
39     }
40 
41     public void setRegion(String region) {
42         this.region = region;
43     }
44 
45     public double getX() {
46         return x;
47     }
48 
49     public void setX(double x) {
50         this.x = x;
51     }
52 
53     public double getY() {
54         return y;
55     }
56 
57     public void setY(double y) {
58         this.y = y;
59     }
60 }
View Code

 

获取json依然用rxjava和Retrofit      city对象还是GsonFormat自动解析的  代码就不贴了

public class NetWork {

    private static CityApi cityApi;

    public static CityApi getCityApi(){
        if (cityApi==null){
            Retrofit retrofit=new Retrofit.Builder().baseUrl("http://apis.baidu.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
            cityApi=retrofit.create(CityApi.class);
        }
        return cityApi;
    }
}
public interface CityApi {
    //http://apis.baidu.com/tngou/factory/province
    @GET("tngou/factory/province")
    rx.Observable<City>getCity(@Header("apikey")String apikey);
}

 

主布局就一个RecyclerView ,悬停布局一个textview ,item 布局三个textview 

技术分享
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <TextView
 3     android:id="@+id/item_headtv"
 4     xmlns:android="http://schemas.android.com/apk/res/android"
 5     xmlns:tools="http://schemas.android.com/tools"
 6     android:layout_width="match_parent"
 7     android:layout_height="wrap_content"
 8     android:padding="10dp"
 9     tools:text="吸顶文本"
10     android:background="@color/hole_bule"
11     />
headview
技术分享
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3                 android:layout_width="match_parent"
 4                 android:layout_height="wrap_content"
 5                 android:padding="11dp"
 6                 android:background="@color/blue_semi_transparent_pressed"
 7     >
 8 
 9     <TextView
10         android:id="@+id/tv_sticky_province"
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:layout_alignParentLeft="true"
14         android:layout_centerVertical="true"
15         android:text="province"
16         />
17 
18     <TextView
19         android:id="@+id/tv_sticky_x"
20         android:layout_width="wrap_content"
21         android:layout_height="wrap_content"
22         android:layout_alignParentRight="true"
23         android:text="X"
24         />
25 
26     <TextView
27         android:id="@+id/tv_sticky_y"
28         android:layout_width="wrap_content"
29         android:layout_height="wrap_content"
30         android:layout_alignParentRight="true"
31         android:layout_below="@+id/tv_sticky_x"
32         android:text="Y"
33         />
34 </RelativeLayout>
item

 

 

adapter   一如既往 继承 RecyclerView.Adapter   并实现  StickyRecyclerHeadersAdapter   重写head的三个方法  

onBindHeaderViewHolder    onCreateHeaderViewHolder  和 RecyclerView的一样 创建分组的view 绑定分组的数据

getHeaderId 稍微有点麻烦 返回值类型为long  所以我在最开始 CityInfo  多设置了一个type  如果api自带那就轻松了 。代码中返回-1的意思是为了把位置为0的item设置成置顶,并不会被分组

 1 public class StickyAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements StickyRecyclerHeadersAdapter {
 2 
 3     private List<CityInfo>list=new ArrayList<CityInfo>();
 4 
 5     public void add(CityInfo object) {
 6         list.add(object);
 7         notifyDataSetChanged();
 8     }
 9 
10     public void addAll(Collection<? extends CityInfo> collection){
11         if (collection!=null){
12             list.addAll(collection);
13             notifyDataSetChanged();
14         }
15     }
16 
17     @Override
18     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
19         View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_stick2,parent,false);
20         return new ItemHolder(view);
21     }
22 
23     @Override
24     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
25         if (holder instanceof ItemHolder){
26             ItemHolder itemHolder= (ItemHolder) holder;
27             itemHolder.tv_province.setText(list.get(position).getProvince()+"  "+getItem(position));
28 
29             itemHolder.tv_y.setText("Y轴 "+list.get(position).getY());
30             itemHolder.tv_x.setText("X轴 "+list.get(position).getX());
31         }
32 
33     }
34 
35     @Override
36     public long getHeaderId(int position) {
37         if (position==0){
38             return -1;
39         }else {
40             return getItem(position).charAt(0);
41         }
42     }
43 
44     public String getItem(int position) {
45         return list.get(position).getType();
46     }
47 
48     @Override
49     public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {
50         View view=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_headview,viewGroup,false);
51         return new RecyclerView.ViewHolder(view) {
52 
53         };
54     }
55 
56     @Override
57     public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) {
58         TextView textView = (TextView) holder.itemView;
59         textView.setText(list.get(position).getRegion());
60        // holder.itemView.setBackgroundColor(getRandomColor());
61     }
62 
63     private int getRandomColor() {
64         SecureRandom rgen = new SecureRandom();
65         return Color.HSVToColor(150, new float[]{
66                 rgen.nextInt(359), 1, 1
67         });
68     }
69 
70     @Override
71     public int getItemCount() {
72         return list.size();
73     }
74 
75     class ItemHolder extends RecyclerView.ViewHolder{
76 
77         @Bind(R.id.tv_sticky_province)
78         TextView tv_province;
79         @Bind(R.id.tv_sticky_x)
80         TextView tv_x;
81         @Bind(R.id.tv_sticky_y)
82         TextView tv_y;
83 
84         public ItemHolder(View itemView) {
85             super(itemView);
86             ButterKnife.bind(this,itemView);
87         }
88     }
89 
90 }

 

再看逻辑代码  

StickyRecyclerHeadersDecoration 很重要 一定要设置给recyclerView 不然就不会有head了。   可以发现 它继承了 ItemDecoration,后者通常 是为每个Item视图添加子视图,被用来绘制Divider,可以用,可以不用

添加的head 如果想 相应点击事件,那就要用到 StickyRecyclerHeadersTouchListener,构造参数是 recyclerView 和 StickyRecyclerHeadersDecoration ,得到实例 再用 setOnHeaderClickListener 即可

如果只想获取整个item的点击事件,可以直接用 样品   33到39行 就搞定了

添加item之间的间隙  可以用 这个文件     recyclerView.addItemDecoration(new DividerDecoration(mContext));

第一个数据我自行添加了一个,为了看置顶的效果,后面的list数据 先根据地区信息设置了我需要的type  ,然后进行了一下根据type字母的排序,不然传进去list很乱

 

  1 public class Sticky2Activity extends BaseActivity {
  2 
  3     @Bind(R.id.rcv_stick)
  4     RecyclerView recyclerView;
  5 
  6     private List<CityInfo> list = new ArrayList<CityInfo>();
  7     private StickyAdapter2 adapter;
  8     private StickyRecyclerHeadersDecoration  headersDecoration;
  9 
 10     @Override
 11     protected void onCreate(Bundle savedInstanceState) {
 12         super.onCreate(savedInstanceState);
 13         setContentView(R.layout.activity_sticky2);
 14         ButterKnife.bind(this);
 15         adapter = new StickyAdapter2();
 16         headersDecoration=new StickyRecyclerHeadersDecoration(adapter);
 17 
 18         recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
 19         recyclerView.setAdapter(adapter);
 20        // recyclerView.addItemDecoration(new StickyRecyclerHeadersDecoration(adapter));
 21         recyclerView.addItemDecoration(headersDecoration);
 22         recyclerView.setItemAnimator(new DefaultItemAnimator());
 23         recyclerView.addItemDecoration(new DividerDecoration(mContext));
 24 
 25         StickyRecyclerHeadersTouchListener headersTouchListener=new StickyRecyclerHeadersTouchListener(recyclerView,headersDecoration);
 26         headersTouchListener.setOnHeaderClickListener(new StickyRecyclerHeadersTouchListener.OnHeaderClickListener() {
 27             @Override
 28             public void onHeaderClick(View view, int position, long headerId) {
 29                 showToast("Header position: " + position + ", id: " + headerId);
 30             }
 31         });
 32 
 33         recyclerView.addOnItemTouchListener(headersTouchListener);
 34         recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(mContext, new RecyclerItemClickListener.OnItemClickListener() {
 35             @Override
 36             public void onItemClick(View view, int position) {
 37                 showToast("position "+position);
 38             }
 39         }));
 40 
 41 
 42         NetWork.getCityApi().getCity("f44bd76826571234e2616746eabf3c3c").subscribeOn(Schedulers.io()).observeOn
 43                 (AndroidSchedulers.mainThread()).subscribe(new Action1<City>() {
 44 
 45             @Override
 46             public void call(City city) {
 47                 if (city.isStatus()) {
 48                     int size = city.getTngou().size();
 49                     CityInfo info = new CityInfo();
 50                     info.setProvince("USA");
 51                     info.setRegion("西南地区");
 52                     info.setX(20.032);
 53                     info.setY(20.032);
 54                     info.setType("a");
 55                     list.add(info);
 56 
 57                     for (int i = 0; i < size; i++) {
 58                         City.TngouBean bean = city.getTngou().get(i);
 59                         CityInfo cityInfo = new CityInfo();
 60                         cityInfo.setProvince(bean.getProvince());
 61                         cityInfo.setRegion(bean.getRegion());
 62                         cityInfo.setX(bean.getX());
 63                         cityInfo.setY(bean.getY());
 64                         cityInfo.setType(settype(bean.getRegion()));
 65                         list.add(cityInfo);
 66                     }
 67                     Collections.sort(list, new Comparator<CityInfo>() {
 68                         @Override
 69                         public int compare(CityInfo lhs, CityInfo rhs) {
 70                             String a=lhs.getType();
 71                             String b=rhs.getType();
 72                             return a.compareToIgnoreCase(b);
 73                         }
 74                     });
 75                     adapter.addAll(list);
 76                 }
 77             }
 78         });
 79     }
 80 
 81     private String settype(String region) {
 82         switch (region) {
 83             case "华东地区":
 84                 return "a";
 85             case "华北地区":
 86                 return "b";
 87             case "华南地区":
 88                 return "c";
 89             case "华中地区":
 90                 return "d";
 91             case "东北地区":
 92                 return "e";
 93             case "西北地区":
 94                 return "f";
 95             case "西南地区":
 96                 return "g";
 97             default:
 98             case "台港澳地区":
 99                 return "h";
100         }
101     }
102 }

 

FastAdapter 这个貌似也不错 以后学习

 

 

RecyclerView 分组悬停

原文:http://www.cnblogs.com/demon9/p/5737568.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!