RecycleView加入底部loadmore(四)

之前已经讲了一些列的关于recycleView的知识。

现在我们完整实现一个loadmore

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private int mLoadStatus;
    private String[] mDataset;
    public static final int TYPE_NORMAL = 0x2;
    public static final int TYPE_FOOTER = 0x1;

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;

        public MyViewHolder(View v) {
            super(v);
            mTextView = (TextView) v;
        }

        public void bindData(String s) {
            mTextView.setText(s);
        }
    }

    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        TextView v = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        Log.i("MyAdapter", "onCreateViewHolder");
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view;
        RecyclerView.ViewHolder holder;
        if (viewType == TYPE_NORMAL) {
            view = inflater.inflate(R.layout.my_text_view, parent, false);
            holder = new MyViewHolder(view);
        } else if (viewType == TYPE_FOOTER) {
            view = inflater.inflate(R.layout.holder_load_more_following, parent, false);
            holder = new FooterViewHolder(view);
        } else {
            throw new IllegalArgumentException("wrong viewType !!!");
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MyViewHolder) {
            MyViewHolder viewHolder = (MyViewHolder) holder;
            viewHolder.bindData(mDataset[position]);
        } else if (holder instanceof FooterViewHolder) {
            FooterViewHolder viewHolder = (FooterViewHolder) holder;
            viewHolder.bind(mLoadStatus);
        }
    }

    @Override
    public int getItemCount() {
        return (mDataset == null || mDataset.length == 0) ? 0 : mDataset.length + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return TYPE_FOOTER;
        } else {
            return TYPE_NORMAL;
        }
    }

    private void setLoadMoreStatus(@LoadMoreStatus.HolderLoadMoreStatusSpec int loadingState) {
        this.mLoadStatus = loadingState;
        notifyItemChanged(getItemCount() - 1);
    }

    public void startLoadMore() {
        this.mLoadStatus = LoadMoreStatus.STATE_LOADING;
        notifyItemChanged(getItemCount() - 1);
    }

    public void LoadMoreSuccess() {
        this.mLoadStatus = LoadMoreStatus.STATE_SUCCESS;
        notifyItemChanged(getItemCount() - 1);
    }

    public void LoadMoreFail() {
        this.mLoadStatus = LoadMoreStatus.STATE_ERROR;
        notifyItemChanged(getItemCount() - 1);
    }

    public void LoadMoreNodate() {
        this.mLoadStatus = LoadMoreStatus.STATE_NODATA;
        notifyItemChanged(getItemCount() - 1);
    }

    private class FooterViewHolder extends RecyclerView.ViewHolder {
        private final ProgressBar mProgressBar;
        private final TextView mHint;

        public FooterViewHolder(View view) {
            super(view);
            mProgressBar = (ProgressBar) view.findViewById(R.id.holder_load_more_progress);
            mHint = (TextView) view.findViewById(R.id.holder_load_more_hint);
        }

        void bind(int state) {
            switch (state) {
                case LoadMoreStatus.STATE_IDLE:
                    itemView.setVisibility(View.GONE);
                    break;
                case LoadMoreStatus.STATE_LOADING:
                    itemView.setVisibility(View.VISIBLE);
                    mProgressBar.setVisibility(View.VISIBLE);
                    mHint.setVisibility(View.VISIBLE);
                    mHint.setText("加载中...");
                    break;
                case LoadMoreStatus.STATE_SUCCESS:
                    itemView.setVisibility(View.GONE);
                    break;
                case LoadMoreStatus.STATE_NODATA:
                    mProgressBar.setVisibility(View.GONE);
                    mHint.setVisibility(View.VISIBLE);
                    mHint.setText("已经全部加载完毕");
                    itemView.setVisibility(View.GONE);
                    break;
                case LoadMoreStatus.STATE_ERROR:
                    itemView.setVisibility(View.VISIBLE);
                    mProgressBar.setVisibility(View.GONE);
                    mHint.setVisibility(View.VISIBLE);
                    mHint.setText("加载失败");
                    break;
            }
        }

    }
}
 
实现要点:
1.人为增加item的数量(修改getItemCount方法),多增加的一条为footView
2.footView和普通item使用不同viewHolder,viewType。
3.footView(LoadMoreView)更新的时候使用notifyItemChanged(getItemCount() - 1);



Activity代码如下

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    int state = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        String [] myDataset = {"11","22","33"};
        mAdapter = new MyAdapter(myDataset);
        mRecyclerView.setAdapter(mAdapter);
       doShowLoadMoreStatue();
    }

    private void doShowLoadMoreStatue() {
        state++;
        mRecyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (state %4==1){
                    mAdapter.startLoadMore();
                }
                if (state %4==2){
                    mAdapter.LoadMoreSuccess();
                }
                if (state %4==3){
                    mAdapter.LoadMoreFail();
                }
                if (state %4==0){
                    mAdapter.LoadMoreNodate();
                }
                doShowLoadMoreStatue();
            }
        },3000);
    }

}
 
效果还可以




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值