這才是你想要的RecyclerView的擴充套件庫

arjinmc發表於2018-04-16

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)

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)

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;
        }
    });
複製程式碼
  1. RecyclerViewGroupAdapter

特別要注意的是這個Adapter的第一個item一定是一個group type。

例:

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

之前介紹的https://blog.csdn.net/arjinmc/article/details/74508483

還有新的RecyclerViewGroupItemDecoration分組分割線。可以在sample中GroupGridActivity中可以看到它的一種使用方式。

Style

轉換一些通用的RecyclerView佈局方式。

更多API的詳細介紹,請檢視wiki。

如果你發現了bug,或者你有什麼新的想法,需求歡迎email給我。arjinmc@hotmail.com

相關文章