软件编程
位置:首页>> 软件编程>> Android编程>> RecyclerView上拉加载封装代码

RecyclerView上拉加载封装代码

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

标签:RecyclerView,上拉加载

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com