recycle的加载更多以及网格和列表布局的随意切换

来源:互联网 发布:win32编程视频教程 编辑:程序博客网 时间:2024/05/17 07:13

第一篇文章:写博客都是为了记录一些安卓开发过程中遇到的常见问题解决和功能实现。 废话不多说切入正题。我们都知道谷歌官方没有提供给我们加载更多的功能框架,recycleview在开发过程中应用频繁。它可以实现各种布局,如listview列表和gridview的表格还有轮播器,以及丰富多彩的瀑布流。这篇文章讲述如何自己完成一个加载更多功能。控件recycleview,适配器recycleview.adapter。

      适配器代码如下: 由于这块涉及到两种item,所以我写了两个viewholder,所以直接recycleview.adapter后的泛型写成recycleview.viewHolder,让两种item对应的viewholder进行继承。 首先将如何实现加载更多,我们的思路是把列表的item分为两种类型(也就是加载两种布局),这个可以在getItemViewType中实现;

//加载更多

//此方法在activity里调用控制加载更多item的显示和隐藏

  public SellerRecyclerAdapter setShowLoadMore(boolean showLoadMore){

      isShowLoadMore = showLoadMore;

       return this;

   }

//得到加载更多布局的数量1或者0

   private int getFooterItemCount() {

      return isShowLoadMore ? 1: 0;

  }

  //条目类型的切换

  @Override public int getItemViewType(int position) {

  //当加载更多为true并且位置在另一种item数量的最后一个位置加1处显示

       if (isShowLoadMore && position + 1 == getItemCount()) {

          return TYPE_FOOTER;

       }

else {

           return TYPE_ITEM;

       } }

   public class SellerRecyclerAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder>{

  List<Map<String, String>> mData;

  private Context context;

  private int type;

   SellerViewHolder sellerViewHolder;

   private static final int TYPE_ITEM = 0;

  private static final int TYPE_FOOTER = 1;

   private boolean isShowLoadMore = false;

  public SellerRecyclerAdapter(List<Map<String, String>> mData, Context context,int type ) {

      this.mData = mData;

      this.context = context;

      this.type=type; }

  //加载更多

   public SellerRecyclerAdapter setShowLoadMore(boolean showLoadMore) {

       isShowLoadMore = showLoadMore;

       return this; }

  private int getFooterItemCount() {

       return isShowLoadMore ? 1: 0;

   } /

/条目类型

   @Override public int getItemViewType(int position) {

      if (isShowLoadMore && position + 1 == getItemCount()) {

          return TYPE_FOOTER;

       }else {

          return TYPE_ITEM;

      }

   }

  @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

       switch (viewType){ case TYPE_ITEM://正常类型

              if (type==1){

                   return sellerViewHolder= new SellerViewHolder(LayoutInflater.from(context) .inflate(R.layout.list_product, parent, false));//线性

              }else if (type==2){

               return sellerViewHolder= new SellerViewHolder(LayoutInflater.from(context) .inflate(R.layout.item_new_goods, parent, false));

              } case TYPE_FOOTER:

              //显示加载更多

              return new FootViewHolder(LayoutInflater.from(context) .inflate(R.layout.load_more, parent, false));

      } return null;

   }

   @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") final int position) {

       if (holder instanceof SellerViewHolder) {

       //此处可以得要用的Viewholder对控件赋值

          sellerViewHolder = (SellerViewHolder) holder;

           }}

   @Override public int getItemCount() {

      return mData.size();

   }

  class SellerViewHolder extends RecyclerView.ViewHolder {

       @BindView(R.id.imgPhoto) ImageView image;

       @BindView(R.id.txtTitle) TextView txtTitle; 

     private TextView txtCity; ImageView ivMix,tvFavour1,tvFavour2,tvFavour3; LinearLayout layFavourList; RelativeLayout relativeLayout; public SellerViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } /** *加载更多的布局 第二种布局 */ private static class FootViewHolder extends RecyclerView.ViewHolder { FootViewHolder(View view) { super(view); } }}

/*接下来是activity中的调用*/还有一个重要的我自己写的recycleview的滑动监听类/*

        recycleView的滑动监听事件

import android.support.v7.widget.GridLayoutManager;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

public abstract class RecyclerViewScrollListener extends RecyclerView.OnScrollListener {

   protected int autoLoadLineCount = 1;

  public RecyclerViewScrollListener() {

  }

  public RecyclerViewScrollListener(int autoLoadLineCount) {

      this.autoLoadLineCount = autoLoadLineCount;

   }

   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

      super.onScrolled(recyclerView, dx, dy);

      int spanCount = 1;

       RecyclerView.LayoutManager mLayoutManager = recyclerView.getLayoutManager();

       if (mLayoutManager instanceof GridLayoutManager) {

           spanCount = ((GridLayoutManager) mLayoutManager).getSpanCount();

       } i

       int endPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();

        int totalCount = recyclerView.getAdapter().getItemCount();

       int lastLineCount = totalCount % spanCount;

       int minNeedLoadMorePosition = totalCount - 1 - autoLoadLineCount * spanCount;

       if (lastLineCount != 0) {

          minNeedLoadMorePosition += spanCount - lastLineCount;

       }

       if (endPosition >= minNeedLoadMorePosition) {

          onLoadMore();

      }

   } public abstract void onLoadMore();

    });}

  /*接下来是activity中的调用*/首先是实例化监听类:再第一次请求结束后根据相应的条件判断是否有更多数据:

          sellerProductAdapter.notifyDataSetChanged();

          sellerProductAdapter.setShowLoadMore(false);//移除加载更多

          recyclerView.removeOnScrollListener(recyclerViewScrollListener);

           //判断是否有更多

          if (listProduct.size()<iAllRecordNum){

            //显示加载更多布局

               sellerProductAdapter.setShowLoadMore(true);

                        isLoadMore=true;

               //上滑监听再加载更多 添加滑动监听

              recyclerView.addOnScrollListener(recyclerViewScrollListener);

          }else {

              //显示布局没有更多了

              noMore.setVisibility(View.VISIBLE);

               sellerProductAdapter.setShowLoadMore(false);

              isLoadMore=false; } } }

     : 这个如果网速过快或者滑动速度快了加载更多的布局会一闪而过:我为了实现效果再下次刷新请求的时候利用handler让时间停留了几秒 //滑动监听判断一下isLoadMore的值 这个滑动监听有待优化

  private void loadMore() {

     if (isLoadMore){

         //主线程 android.os.Handler handler=new android.os.Handler();

          Thread thread=new Thread(new Runnable() {

             @Override public void run() {

                  DoSearchAction(false);

             }

          });

          handler.postDelayed(thread, 2000); } }。

ok这样就可以实现了。

阅读全文
1 0