可隨意定製的RecyclerView 適配器、設置狀態:無數據、無網絡等

CustomAdapter

項目地址:github.com/genius158/C…

可隨意定製的RecyclerView 適配器

1.支持多類型

3.支持添加狀態如:獲取數據失敗、網絡沒有鏈接等(可控制隱藏與顯示)

關於加載更多

因爲加載更多的實現方法不少,這裏並無引入這個功能,例子中也給了一個來自度孃的簡單實現,有須要能夠參考一下

演示圖

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();
            }
    });複製代碼
相關文章
相關標籤/搜索