之前已经讲了一些列的关于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); } }
效果还可以