RecyclerView上拉加载封装代码

作者:desireyao 时间:2023-05-08 21:02:05 

RecyclerView上拉加载,先看效果:

RecyclerView上拉加载封装代码

网上有很多这类得框架,不过在自己的项目只用到上拉加载的功能,所以自己封装一个简单点的。

主要依赖BaseRecyPRAdapter这类


public abstract class BaseRecyPRAdapter<T> extends RecyclerView.Adapter<BaseRecyPRAdapter.BaseViewHolder> {
 private static final String TAG = "BaseRecyPRAdapter";

public static final int VIEW_ITEM = 0;
 public static final int VIEW_PROG = 1;

public List<T> mDataList;

private final Context mContext;
 private final RecyclerView mRecyclerView;
 private int totalItemCount;
 private int lastVisibleItemPosition;
 boolean isShowFootVieW = false;
 private Handler handler = new Handler();

private static final int STATE_NORMAL = 0;
 private static final int STATE_LOADING = 1;
 private static final int STATE_LOAD_COMPLETE = 2;
 private int mState = STATE_NORMAL;

public BaseRecyPRAdapter(Context context, RecyclerView recyclerView) {
   mContext = context;
   mRecyclerView = recyclerView;
   if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
     final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
       @Override
       public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
         super.onScrollStateChanged(recyclerView, newState);
         int extent = recyclerView.computeVerticalScrollExtent();
         int range = recyclerView.computeVerticalScrollRange();
         Log.e(TAG, "\n extent = " + extent + "\n range = " + range);

if (range > extent) {
           if(!isShowFootVieW){
             notifyDataSetChanged();
           }
           isShowFootVieW = true;
         } else {
           isShowFootVieW = false;
         }

totalItemCount = linearLayoutManager.getItemCount();
         if (mState == STATE_NORMAL && newState == RecyclerView.SCROLL_STATE_IDLE &&
             totalItemCount == lastVisibleItemPosition + 1 && range > extent) {
           mState = STATE_LOADING;
           handler.post(new Runnable() {
             @Override
             public void run() {
               if (mLoadMoreDataListener != null) {
                 mLoadMoreDataListener.loadMoreData();
               }
             }
           });
         }
       }

@Override
       public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
         super.onScrolled(recyclerView, dx, dy);
         lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
       }
     });
   }

}

@Override
 public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   BaseViewHolder holder = null;
   View view = null;
   if (viewType == VIEW_PROG) {
     view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer, parent, false);
   } else {
     view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
   }
   holder = new BaseViewHolder(view);
   return holder;
 }

@Override
 public void onBindViewHolder(BaseViewHolder holder, int position) {
   if (holder.getItemViewType() == BaseRecyPRAdapter.VIEW_PROG) {
//      LogTool.LogE_DEBUG(TAG, "onBindViewHolder--->" + mState);
     ProgressBar progressBar = (ProgressBar) holder.getView(R.id.progressbar);
     TextView text = (TextView) holder.getView(R.id.text);

if (mState == STATE_LOAD_COMPLETE) {
       progressBar.setVisibility(View.GONE);
       text.setText(mContext.getString(R.string.没有数据了));
     } else {
       progressBar.setVisibility(View.VISIBLE);
       text.setText(mContext.getString(R.string.正在加载中));
     }
   }

if (holder.getItemViewType() == BaseRecyPRAdapter.VIEW_ITEM) {
     onBindData(holder, position);
   }
 }

@Override
 public int getItemCount() {
   if (isShowFootVieW) {
     return mDataList == null ? 0 : mDataList.size() + 1;
   } else {
     return mDataList == null ? 0 : mDataList.size();
   }
 }

//根据不同的数据返回不同的viewType
 @Override
 public int getItemViewType(int position) {
   if (mDataList == null)
     return VIEW_ITEM;

if (position == mDataList.size()) {
     return VIEW_PROG;
   } else {
     return VIEW_ITEM;
   }
 }

/**
  * 根据type 返回不同的布局
  *
  * @param type
  * @return
  */
 public abstract int getLayoutId(int type);

public abstract void onBindData(BaseViewHolder holder, int position);

public static class BaseViewHolder extends RecyclerView.ViewHolder {
   private Map<Integer, View> mViewMap;
   public View view;

public BaseViewHolder(View itemView) {
     super(itemView);

view = itemView;
     mViewMap = new HashMap<>();
   }

/**
    * 获取设置的view
    *
    * @param id
    * @return
    */
   public View getView(int id) {
     View view = mViewMap.get(id);
     if (view == null) {
       view = itemView.findViewById(id);
       mViewMap.put(id, view);
     }
     return view;
   }
 }

public void stopLoadMore() {
   mState = STATE_NORMAL;
   notifyDataSetChanged();
 }

public void loadComplete() {
   mState = STATE_LOAD_COMPLETE;
   notifyItemChanged(getItemCount()-1);
 }

public void setData(List<T> datas) {
   mDataList = datas;
 }

private LoadMoreDataListener mLoadMoreDataListener;

public void setLoadMoreDataListener(LoadMoreDataListener mLoadMoreDataListener) {
   this.mLoadMoreDataListener = mLoadMoreDataListener;
 }

public interface LoadMoreDataListener {
   void loadMoreData();
 }
}

在activity中使用:


public class MainActivity extends AppCompatActivity {

private static final String TAG = "RecyActivity";
 private RecyclerView mRecyclerView;
 private List<String> list = new ArrayList<>();
 private MyRecyViewAdapter mAdapter;
 private Handler handler = new Handler();

@Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

init();
 }

private void init() {
   initView();
   initData();

initListener();
 }

private void initView() {
   mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);

//创建一个LinearLayoutManager对象
   LinearLayoutManager linearLayoutManager = new LinearLayoutManager(
       this, LinearLayoutManager.VERTICAL, false);
   mRecyclerView.setLayoutManager(linearLayoutManager);

//创建adapter对象
   mAdapter = new MyRecyViewAdapter(this, mRecyclerView);
   mRecyclerView.setAdapter(mAdapter);
   mAdapter.setData(list);//设置数据
 }

//初始化数据
 private void initData() {
   for (int i = 0; i < 15; i++) {
     list.add("DATA---------->" + i);
   }
 }

//初始化监听
 private void initListener() {
   //加载更多回调监听
   mAdapter.setLoadMoreDataListener(new BaseRecyPRAdapter.LoadMoreDataListener() {
     @Override
     public void loadMoreData() {
       //加入null值此时adapter会判断item的type
       Log.e(TAG, "loadMoreData--->");
       handler.postDelayed(new Runnable() {
         @Override
         public void run() {
           if (list.size() < 30) {
             for (int i = 0; i < 5; i++) {
               list.add("LOAD MORE DATA---------->" + i);
             }
             mAdapter.stopLoadMore();
           } else {
             mAdapter.loadComplete();
           }
         }
       }, 500);
     }
   });
 }

class MyRecyViewAdapter extends BaseRecyPRAdapter<String> {

public MyRecyViewAdapter(Context context, RecyclerView recyclerView) {
     super(context, recyclerView);
   }

@Override
   public int getLayoutId(int type) {
     return R.layout.item_view;
   }

@Override
   public void onBindData(BaseViewHolder holder, int position) {
     Log.e(TAG, "onBindData--->" + position);
     if (mDataList == null || mDataList.isEmpty())
       return;

TextView tv = (TextView) holder.getView(R.id.tv_name);
     if (tv != null) {
       tv.setText("DATA--------->" + position);
     }
   }
 }
}

来源:http://blog.csdn.net/desireyaoo/article/details/77585079

标签:RecyclerView,上拉加载
0
投稿

猜你喜欢

  • 详解Flutter桌面应用如何进行多分辨率适配

    2023-06-17 07:14:59
  • java读写oracle的blob字段示例

    2023-12-22 16:19:00
  • Java实现按权重随机数

    2023-11-28 23:15:32
  • 浅析依赖注入框架Autofac的使用

    2023-04-19 22:23:31
  • 解读JSONArray删除元素的两种方式

    2022-10-31 11:40:50
  • springMVC如何将controller中Model数据传递到jsp页面

    2023-05-25 23:46:58
  • Lombok为啥这么牛逼?SpringBoot和IDEA官方都要支持它

    2021-10-18 23:04:50
  • java实现简单的webservice方式

    2023-11-25 03:59:58
  • Android实现沉浸式状态栏功能

    2022-10-25 23:19:36
  • Java初学者问题图解(动力节点Java学院整理)

    2023-10-15 18:06:11
  • Java读取json数据并存入数据库的操作代码

    2023-09-23 06:00:57
  • 搭建简单的Spring-Data JPA项目

    2023-04-05 01:06:30
  • Java Spring框架简介与Spring IOC详解

    2021-08-06 03:05:56
  • android实现密码框右侧显示小眼睛

    2023-01-26 19:54:59
  • java 算法之快速排序实现代码

    2023-01-30 01:44:59
  • Java输入年份和月份判断多少天实例代码

    2023-12-23 10:43:11
  • Android自定义广播接收

    2023-04-30 09:39:31
  • Java代码为例讲解堆的性质和基本操作以及排序方法

    2021-08-27 05:32:25
  • 详解AngularJs与SpringMVC简单结合使用

    2023-10-22 04:19:08
  • Android自定义样式圆角dialog对话框

    2023-11-04 20:34:10
  • asp之家 软件编程 m.aspxhome.com