可隨意定製的RecyclerView 介面卡、設定狀態:無資料、無網路等

北緯34點8度發表於2017-01-15

CustomAdapter

專案地址:github.com/genius158/C…

可隨意定製的RecyclerView 介面卡

1.支援多型別

3.支援新增狀態如:獲取資料失敗、網路沒有連線等(可控制隱藏與顯示)

關於載入更多

由於載入更多的實現方法很多,這裡並沒有引入這個功能,例子中也給了一個來自度孃的簡單實現,有需要可以參考一下

可隨意定製的RecyclerView 介面卡、設定狀態:無資料、無網路等
演示圖

include lib

Gradle: compile 'com.yan.adapter:adapter:+'複製程式碼

how to use

    //adapter初始化,該怎麼用還怎麼用
    adapter = initAdapter(dataList);
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
    //recyclerView.setLayoutManager(new LinearLayoutManager(this));
    //recyclerView.setLayoutManager(new GridLayoutManager(this,2));
    recyclerView.setAdapter(adapter);複製程式碼

1.新增普通的資料型別

    //新增普通的資料型別 CustomAdapterItem<T,V> T為holder的型別,V為資料型別
    .addAdapterItem(new CustomAdapterItem<HolderTest1, Integer>() {
            @Override
            public Class dataType() {
                    return Integer.class;//直接返回資料型別,這裡並沒有根據V的泛型判斷資料型別,畢竟反射影響執行效率
            }
            @Override
            public HolderTest1 viewHolder(ViewGroup parent) {
                    return new HolderTest1(
                        LayoutInflater.from(MainActivity.this).inflate(R.layout.item_type_1, parent, false)
                    );
            }
            @Override
            public void bindData(HolderTest1 holder, Integer item, int position) {
                    holder.textView.setText(item + "");
            }
    })複製程式碼

2.新增狀態型別

    //新增狀態型別 StateAdapterItem<HolderTest2>(String tag, boolean isShow) tag是標籤,便於之後找到這個item;isShow為是否顯示
    .addAdapterItem(new StateAdapterItem<HolderTest2>("NO_WIFI", false) {
            @Override
            public HolderTest2 viewHolder(ViewGroup parent) {
                    HolderTest2 holderTest2 = new HolderTest2(
                            LayoutInflater.from(MainActivity.this).inflate(R.layout.state_view, parent, false)
                    );
                    holderTest2.textView.setText("確保網路連線正常");
                    return holderTest2;
            }
    })
    //在recycleview初次載入的時候,不可見的item並不會執行createviewholder,所以如果你需要對item做動態修改最好以傳參的方式傳入viewholder
    .addAdapterItem(new StateAdapterItem<HolderTest2>("DataError", false,
                    getHolder()) {
            @Override
            public HolderTest2 viewHolder(ViewGroup parent) {
                    return null;
            }
    })
    //當然也可以是stateAdapterItem.setHolder(ViewHolder)來設定
    //------------------------------------------------
    private HolderTest2 getHolder() {//這裡佈局大小需要自己給定
            RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
                    RecyclerView.LayoutParams.MATCH_PARENT);
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.state_view, null);
            view.setLayoutParams(layoutParams);
            HolderTest2 holderTest2 = new HolderTest2(view);
            holderTest2.textView.setText("獲取資料出錯");
            return holderTest2;
    }
    //------------------------------------------------複製程式碼
    //新增header
    .addAdapterItem(new StateAdapterItem<HolderTest2>(StateAdapterItem.HEADER)
    //新增footer
    .addAdapterItem(new StateAdapterItem<HolderTest2>(StateAdapterItem.FOOTER)複製程式碼

4.動態更改資料

    StateAdapterItem dataError = adapter.findStateItem("DataError");
    //以引數形式傳入的ViewHolder不會出現viewholder為空的情況
    ((HolderTest2) dataError.getHolder()).textView.append("!");
    ((HolderTest2) adapter.getStateFooter().getHolder())
            .textView.setText("footer" + times);
    StateAdapterItem noWifi = adapter.findStateItem("NO_WIFI");
    if (noWifi.getHolder() != null)
            ((HolderTest2) noWifi.getHolder()).textView.append(".");
    StateAdapterItem noData = adapter.findStateItem("NO_DATA");
    if (noData.getHolder() != null)
            ((HolderTest2) noData.getHolder()).textView.append("-");複製程式碼

5.控制顯示與隱藏

    adapter.findStateItem("FIXED").hide();
    //或者
    adapter.show("DataError")
            .hide("NO_WIFI")
            .hide("NO_DATA")
            .hideHeader(false)//false不立即執行
            .hideFooter(false)
            .commit();複製程式碼

6.點選事件

     adapter.setOnItemClickListener(...//設定所有位置的點選事件
     //設定資料所在位置的點選事件
    adapter.setOnDataItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(RecyclerView.ViewHolder holder, int position) {
                    ((HolderTest) holder).textView.append(position + "");
                    toast.setText("onItemClick: position " + position);
                    toast.show();
            }
    });複製程式碼

相關文章