栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

RecyclerView上拉加载封装代码

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RecyclerView上拉加载封装代码

RecyclerView上拉加载,先看效果:

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

主要依赖baseRecyPRAdapter这类

public abstract class baseRecyPRAdapter extends RecyclerView.Adapter {
  private static final String TAG = "baseRecyPRAdapter";

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

  public List 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;
    }
  }

  
  public abstract int getLayoutId(int type);

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


  public static class baseViewHolder extends RecyclerView.ViewHolder {
    private Map mViewMap;
    public View view;

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

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

    
    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 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 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 {

    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);
      }
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/158021.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号