【Android】使RecyclerView 支持setEmptyView

自定义一个RecyclerView 的子类,使其支持EmptyView机制。

public class EmptyRecyclerView extends RecyclerView {
    private View emptyView;
    final private AdapterDataObserver observer = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            checkIfEmpty();
        }
    };

    public EmptyRecyclerView(Context context) {
        super(context);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    void checkIfEmpty() {
        if (emptyView != null && getAdapter() != null) {
            final boolean emptyViewVisible = getAdapter().getItemCount() == 0;
            emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
            setVisibility(emptyViewVisible ? GONE : VISIBLE);
        }
    }

    @Override
    public void setAdapter(Adapter adapter) {
        final Adapter oldAdapter = getAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }

        checkIfEmpty();
    }

    public void setEmptyView(View emptyView) {
        this.emptyView = emptyView;
        checkIfEmpty();

        if (emptyView.getParent() == null) {
            //如果emptyView没有父布局,则添加至当前RecyclerView的父View中
            ViewParent parent = getParent();
            if (parent instanceof RelativeLayout) {
                //相对布局
                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                ViewGroup parentView = (ViewGroup) getParent();
                layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
                parentView.addView(emptyView, layoutParams);
            } else if (getParent() instanceof ViewGroup) {
                ViewGroup parentView = (ViewGroup) getParent();
                parentView.addView(emptyView);
            }
        }
    }
}

如果你使用的IRecyclerView,那么如果要支持setEmptyView,可以参照如下代码:
IRecyclerView项目地址在这里,IRecyclerView on GitHUb

package com.xxx;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.RelativeLayout;

import com.aspsine.irecyclerview.IRecyclerView;

/**
 * Created by Administrator on 2016/7/28.
 */
public class EmptyRecyclerView extends IRecyclerView {
    private View                      emptyView;
    final private AdapterDataObserver observer = new AdapterDataObserver() {
                                                   @Override
                                                   public void onChanged() {
                                                       checkIfEmpty();
                                                   }

                                                   @Override
                                                   public void onItemRangeInserted(int positionStart,
                                                                                   int itemCount) {
                                                       checkIfEmpty();
                                                   }

                                                   @Override
                                                   public void onItemRangeRemoved(int positionStart,
                                                                                  int itemCount) {
                                                       checkIfEmpty();
                                                   }
                                               };

    public EmptyRecyclerView(Context context) {
        super(context);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    void checkIfEmpty() {
        Adapter adapter = getMyAdapter();
        if (emptyView != null && adapter != null) {
            final boolean emptyViewVisible = adapter.getItemCount() == 0;
            emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
            setVisibility(emptyViewVisible ? GONE : VISIBLE);
        }
    }

    /**
     * 对getIAdapter做些简单处理,避免跟getAdapter重名,叫getMyAdapter。
     *
     * @return
     */
    private Adapter getMyAdapter() {
        Adapter adapter = null;
        try {
            adapter = getIAdapter();
        } catch (Exception e) {

        }
        return adapter;
    }

    @Override
    public void setIAdapter(Adapter adapter) {
        final Adapter oldAdapter = getMyAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setIAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }

        checkIfEmpty();
    }

    public void setEmptyView(View emptyView) {
        this.emptyView = emptyView;
        checkIfEmpty();

        if (emptyView.getParent() == null) {
            //如果emptyView没有父布局,则添加至当前RecyclerView的父View中
            ViewParent parent = getParent();
            if (parent instanceof RelativeLayout) {
                //相对布局
                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                ViewGroup parentView = (ViewGroup) getParent();
                layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
                parentView.addView(emptyView, layoutParams);
            } else if (getParent() instanceof ViewGroup) {
                ViewGroup parentView = (ViewGroup) getParent();
                parentView.addView(emptyView);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用RecyclerView实现轮播效果,可以按照以下步骤操作: 1. 在布局文件中添加RecyclerView控件,设置宽高和其他属性: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="200dp" android:clipToPadding="false" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="8dp" android:paddingBottom="8dp" android:scrollbars="none" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:orientation="horizontal" /> ``` 2. 创建一个Adapter类,并继承RecyclerView.Adapter<ViewHolder>,实现必要的方法,如onCreateViewHolder、onBindViewHolder和getItemCount等。 3. 在Adapter中添加一个getData()方法,用于获取数据源。 4. 在Activity或Fragment中,设置RecyclerView的Adapter和LayoutManager,并调用RecyclerView的smoothScrollToPosition()方法实现滚动效果: ``` private void initRecyclerView() { LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recyclerView.setLayoutManager(layoutManager); adapter = new MyAdapter(); recyclerView.setAdapter(adapter); // 轮播效果 recyclerView.postDelayed(new Runnable() { @Override public void run() { int position = (currentPosition + 1) % adapter.getData().size(); recyclerView.smoothScrollToPosition(position); currentPosition = position; recyclerView.postDelayed(this, 3000); } }, 3000); } ``` 5. 在轮播效果的实现中,通过RecyclerView的smoothScrollToPosition()方法实现滚动,同时设置一个延时任务,以达到循环轮播的效果。 6. 在延时任务中,更新当前的position,并调用RecyclerView的smoothScrollToPosition()方法实现滚动。 7. 在Adapter的getItemCount()方法中返回一个较大的值,以便实现循环滚动的效果: ``` @Override public int getItemCount() { return getData().size() * 1000; } ``` 注意:以上仅为简单的实现方式,实际应用中还需要考虑数据源的更新、点击事件的处理等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值