欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RecyclerView上拉加載封裝代碼

 更新時(shí)間:2017年08月26日 08:31:54   作者:desireyao  
這篇文章主要為大家詳細(xì)介紹了RecyclerView上拉加載封裝代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

RecyclerView上拉加載,先看效果:

網(wǎng)上有很多這類(lèi)得框架,不過(guò)在自己的項(xiàng)目只用到上拉加載的功能,所以自己封裝一個(gè)簡(jiǎn)單點(diǎn)的。

主要依賴(lài)BaseRecyPRAdapter這類(lèi)

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.沒(méi)有數(shù)據(jù)了));
      } 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();
    }
  }


  //根據(jù)不同的數(shù)據(jù)返回不同的viewType
  @Override
  public int getItemViewType(int position) {
    if (mDataList == null)
      return VIEW_ITEM;

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

  /**
   * 根據(jù)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<>();
    }

    /**
     * 獲取設(shè)置的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);

    //創(chuàng)建一個(gè)LinearLayoutManager對(duì)象
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(
        this, LinearLayoutManager.VERTICAL, false);
    mRecyclerView.setLayoutManager(linearLayoutManager);

    //創(chuàng)建adapter對(duì)象
    mAdapter = new MyRecyViewAdapter(this, mRecyclerView);
    mRecyclerView.setAdapter(mAdapter);
    mAdapter.setData(list);//設(shè)置數(shù)據(jù)
  }

  //初始化數(shù)據(jù)
  private void initData() {
    for (int i = 0; i < 15; i++) {
      list.add("DATA---------->" + i);
    }
  }


  //初始化監(jiān)聽(tīng)
  private void initListener() {
    //加載更多回調(diào)監(jiān)聽(tīng)
    mAdapter.setLoadMoreDataListener(new BaseRecyPRAdapter.LoadMoreDataListener() {
      @Override
      public void loadMoreData() {
        //加入null值此時(shí)adapter會(huì)判斷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);
      }
    }
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實(shí)現(xiàn)拼圖小游戲

    Android實(shí)現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拼圖小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android開(kāi)發(fā)中ListView自定義adapter的封裝

    Android開(kāi)發(fā)中ListView自定義adapter的封裝

    這篇文章主要為大家詳細(xì)介紹了android開(kāi)發(fā)中ListView自定義adapter的封裝,ListView的模板寫(xiě)法,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Jetpack Compose布局的使用詳細(xì)介紹

    Jetpack Compose布局的使用詳細(xì)介紹

    Jetpack Compose是用于構(gòu)建原生Android界面的新工具包。它可簡(jiǎn)化并加快Android上的界面開(kāi)發(fā),使用更少的代碼、強(qiáng)大的工具和直觀的 Kotlin API,快速讓?xiě)?yīng)用生動(dòng)而精彩
    2022-09-09
  • 詳解Android如何實(shí)現(xiàn)好的彈層體驗(yàn)效果

    詳解Android如何實(shí)現(xiàn)好的彈層體驗(yàn)效果

    當(dāng)前?App?的設(shè)計(jì)趨勢(shì)越來(lái)越希望給用戶(hù)沉浸式體驗(yàn),這種設(shè)計(jì)會(huì)讓用戶(hù)盡量停留在當(dāng)前的界面,而不需要太多的跳轉(zhuǎn),這就需要引入彈層。本篇我們就來(lái)講講彈層這塊需要注意哪些用戶(hù)體驗(yàn)
    2022-11-11
  • android 修改launcher行數(shù)和列數(shù)的方法

    android 修改launcher行數(shù)和列數(shù)的方法

    這篇文章主要介紹了android 修改launcher行數(shù)和列數(shù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Android下拉列表框Spinner使用方法詳解

    Android下拉列表框Spinner使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android下拉列表框Spinner的基本使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Android滑動(dòng)沖突的完美解決方案

    Android滑動(dòng)沖突的完美解決方案

    在Android開(kāi)發(fā)中滑動(dòng)沖突可以說(shuō)是比較常見(jiàn)的一類(lèi)問(wèn)題,也是比較讓人頭疼的一類(lèi)問(wèn)題,兩個(gè)原本完美的控件,組合在一起之后,忽然發(fā)現(xiàn)整個(gè)世界都不好了?;瑒?dòng)沖突主要分為同方向滑動(dòng)沖突和不同方向滑動(dòng)沖突,下面本文將詳細(xì)說(shuō)明兩種滑動(dòng)沖突如何解決。
    2016-08-08
  • Android實(shí)現(xiàn)點(diǎn)擊某個(gè)按鈕指定位置彈出布局

    Android實(shí)現(xiàn)點(diǎn)擊某個(gè)按鈕指定位置彈出布局

    這篇文章主要介紹了Android實(shí)現(xiàn)點(diǎn)擊某個(gè)按鈕指定位置彈出布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 微信小程序動(dòng)態(tài)的顯示或隱藏控件的方法(兩種方法)

    微信小程序動(dòng)態(tài)的顯示或隱藏控件的方法(兩種方法)

    在微信小程序開(kāi)發(fā)時(shí),經(jīng)常要用到一個(gè)控件會(huì)根據(jù)不同的情況和環(huán)境動(dòng)態(tài)顯示與隱藏這種情況,下面就來(lái)實(shí)踐一下吧
    2017-01-01
  • Android中文件的壓縮和解壓縮實(shí)例代碼

    Android中文件的壓縮和解壓縮實(shí)例代碼

    這篇文章主要介紹了Android中文件的壓縮和解壓縮,需要的朋友可以參考下
    2017-03-03

最新評(píng)論