这才是你想要的RecyclerView的扩展库

253 阅读6分钟
原文链接: blog.csdn.net

RecyclerView自从2015年推出以来,至今在开源中出现了各种各样的开源库,五花八门,但是,在使用的过程中是否真的适合你呢?这个我就不太清楚,然而,我感觉我还没有找到使用更方便的库,因此,我创建了这个库ExpandRecyclerView

在2015年我创建了一个RecyclerView分割线库叫RecyclerViewDecoration,1.x版本虽然具备很多属性,但是用起来不是很方便。直到2017年,我才改成Builder的方式2.x版,也优化了算法,同时也有一些小伙伴给我提了一些新的需求。到现在为止,也还有一些新的需求,这些问题,我后面都会陆续更新。

包括现在要介绍的ExpandRecyclerView,从1.3版本开始将RecyclerViewDecoration的内容也合并这里。陆续会有更多分割线和adapter结合的API出现。这个库的出现,目的很简单,就是要在使用的过程中,尽量减少使用者的代码量。不清楚怎么使用,可以参考sample中的例子,下面只是简单的介绍。

ExpandRecyclerView目前主要包含几个部分:

Adapter

1.RecyclerViewAdapter

这个adapter可以支持单种item和多种item。

例:(单种item)

[java] view plain copy print?
  1. RecyclerViewAdapter adapter = new RecyclerViewAdapter<>(this, Arrays.asList(titles)  
  2.     , R.layout.item_main_list  
  3.     , new RecyclerViewSingleTypeProcessor<String>() {  
  4.         @Override  
  5.         public void onBindViewHolder(RecyclerViewViewHolder holder,  final int position, String str) {  
  6.             TextView textView = holder.getView(R.id.tv_content);  
  7.             textView.setText(str);  
  8.         }  
  9.     });  
RecyclerViewAdapter adapter = new RecyclerViewAdapter<>(this, Arrays.asList(titles)
    , R.layout.item_main_list
    , new RecyclerViewSingleTypeProcessor<String>() {
        @Override
        public void onBindViewHolder(RecyclerViewViewHolder holder, final int position, String str) {
            TextView textView = holder.getView(R.id.tv_content);
            textView.setText(str);
        }
    });

例:(多种item)

[java] view plain copy print?
  1. mAdapter = new RecyclerViewAdapter<>(this, mDataList  
  2.     , new int[]{R.layout.item_list_type0, R.layout.item_list_type1}  
  3.     , new RecyclerViewMultipleTypeProcessor<Car>() {  
  4.   
  5.         @Override  
  6.         public void onBindViewHolder(RecyclerViewViewHolder holder,  int position, Car object) {  
  7.             if(getItemViewType(position) == 0) {  
  8.                 TextView textView = holder.getView(R.id.tv_content);  
  9.                 textView.setText(object.getBrand() + "/" + object.getTypeName());  
  10.             }else{  
  11.             }  
  12.         }  
  13.   
  14.         @Override  
  15.         public int getItemViewType(int position) {  
  16.             //define two viewTypes  
  17.             if (position % 2 == 0)  
  18.                 return 1;  
  19.             return 0;  
  20.         }  
  21.     });  
mAdapter = new RecyclerViewAdapter<>(this, mDataList
    , new int[]{R.layout.item_list_type0, R.layout.item_list_type1}
    , new RecyclerViewMultipleTypeProcessor<Car>() {

        @Override
        public void onBindViewHolder(RecyclerViewViewHolder holder, int position, Car object) {
            if(getItemViewType(position) == 0) {
                TextView textView = holder.getView(R.id.tv_content);
                textView.setText(object.getBrand() + "/" + object.getTypeName());
            }else{
            }
        }

        @Override
        public int getItemViewType(int position) {
            //define two viewTypes
            if (position % 2 == 0)
                return 1;
            return 0;
        }
    });

2.RecyclerViewGroupAdapter

特别要注意的是这个Adapter的第一个item一定是一个group type。

例:

[java] view plain copy print?
  1. mGroupAdapter = new RecyclerViewGroupAdapter<>(this, mDataList  
  2.                 , new int[]{R.layout.item_group_type, R.layout.item_list_type1}  
  3.                 , new RecyclerViewGroupTypeProcessor<Car>() {  
  4.   
  5.   
  6.             @Override  
  7.             public void onBindGroupViewHolder(RecyclerViewViewHolder holder,  int groupPosition, Car car) {  
  8.                 TextView tvGroup = holder.getView(R.id.tv_group);  
  9.                 tvGroup.setText(car.getGroup());  
  10.             }  
  11.   
  12.   
  13.             @Override  
  14.             public void onBindItemViewHolder(RecyclerViewViewHolder holder,  final int groupPosition, final int itemPosition, Car car) {  
  15.                 TextView tvContent = holder.getView(R.id.tv_content);  
  16.                 tvContent.setText("Car brand:" + car.getBrand() +  " / type: " + car.getTypeName());  
  17.   
  18.   
  19.                 tvContent.setOnClickListener(new View.OnClickListener() {  
  20.                     @Override  
  21.                     public void onClick(View v) {  
  22.                         Toast.makeText(GroupListActivity.this  
  23.                                 , "Group: " + groupPosition +  "\titemPosition: " + itemPosition, Toast.LENGTH_SHORT).show();  
  24.                     }  
  25.                 });  
  26.             }  
  27.   
  28.   
  29.             @Override  
  30.             public int getItemViewType(int position) {  
  31.                 if (mDataList.get(position).getGroup() != null)  
  32.                     return 0;  
  33.                 return 1;  
  34.             }  
  35.         });  
mGroupAdapter = new RecyclerViewGroupAdapter<>(this, mDataList
                , new int[]{R.layout.item_group_type, R.layout.item_list_type1}
                , new RecyclerViewGroupTypeProcessor<Car>() {


            @Override
            public void onBindGroupViewHolder(RecyclerViewViewHolder holder, int groupPosition, Car car) {
                TextView tvGroup = holder.getView(R.id.tv_group);
                tvGroup.setText(car.getGroup());
            }


            @Override
            public void onBindItemViewHolder(RecyclerViewViewHolder holder, final int groupPosition, final int itemPosition, Car car) {
                TextView tvContent = holder.getView(R.id.tv_content);
                tvContent.setText("Car brand:" + car.getBrand() + " / type: " + car.getTypeName());


                tvContent.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(GroupListActivity.this
                                , "Group: " + groupPosition + "\titemPosition: " + itemPosition, Toast.LENGTH_SHORT).show();
                    }
                });
            }


            @Override
            public int getItemViewType(int position) {
                if (mDataList.get(position).getGroup() != null)
                    return 0;
                return 1;
            }
        });

ItemDecoration

之前介绍的blog.csdn.net/arjinmc/art…

还有新的RecyclerViewGroupItemDecoration分组分割线。可以在sample中GroupGridActivity中可以看到它的一种使用方式。

Style

转换一些通用的RecyclerView布局方式。

更多API的详细介绍,请查看wiki

如果你发现了bug,或者你有什么新的想法,需求欢迎email给我。arjinmc@hotmail.com