Android控件三:LRecyclerView实现下拉刷新和上拉加载更多

效果图:
在这里插入图片描述

代码实现

  • EndlessGridLayoutActivity.java
/**
* 带HeaderView的分页加载GridLayout RecyclerView
*/
public class EndlessGridLayoutActivity extends AppCompatActivity {

   /**
    * 服务器端一共多少条数据
    */
   private static final int TOTAL_COUNTER = 154;

   /**
    * 每一页展示多少条数据
    */
   private static final int REQUEST_COUNT = 40;

   /**
    * 已经获取到多少条数据了
    */
   private static int mCurrentCounter = 0;

   private LRecyclerView mRecyclerView = null;

   private MyAdapter mDataAdapter = null;

   private PreviewHandler mHandler = new PreviewHandler(this);
   private LRecyclerViewAdapter mLRecyclerViewAdapter = null;

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.sample_ll_activity);
       mRecyclerView = findViewById(R.id.list);
       //setLayoutManager must before setAdapter
       GridLayoutManager manager = new GridLayoutManager(this, 2);
       mRecyclerView.setLayoutManager(manager);

//        mDataAdapter = new DataAdapter(this);
       mDataAdapter = new MyAdapter(this);

       mLRecyclerViewAdapter = new LRecyclerViewAdapter(mDataAdapter);
       mRecyclerView.setAdapter(mLRecyclerViewAdapter);

       //设置头部加载颜色
       mRecyclerView.setHeaderViewColor(R.color.colorAccent, R.color.dark, android.R.color.white);
       //设置底部加载颜色
       mRecyclerView.setFooterViewColor(R.color.colorAccent, R.color.dark, android.R.color.white);
       //设置底部加载文字提示
       mRecyclerView.setFooterViewHint("拼命加载中", "已经全部为你呈现了", "网络不给力啊,点击再试一次吧");
       int spacing = getResources().getDimensionPixelSize(R.dimen.dp_4);
       mRecyclerView.addItemDecoration(SpacesItemDecoration.newInstance(spacing, spacing, manager.getSpanCount(), Color.GRAY));
       mRecyclerView.setHasFixedSize(true);
       mLRecyclerViewAdapter.addHeaderView(View.inflate(this, R.layout.sample_header, null));

       mRecyclerView.setOnRefreshListener(new OnRefreshListener() {
           @Override
           public void onRefresh() {
               mCurrentCounter = 0;
               mDataAdapter.clear();
               requestData();
           }
       });

       mRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() {
           @Override
           public void onLoadMore() {
               if (mCurrentCounter < TOTAL_COUNTER) {
                   // loading more
                   requestData();
               } else {
                   //the end
                   mRecyclerView.setNoMore(true);
               }
           }
       });

       mRecyclerView.refresh();

       mLRecyclerViewAdapter.setOnItemClickListener(new OnItemClickListener() {
           @Override
           public void onItemClick(View view, int position) {
               //点击item处理
               Toast.makeText(EndlessGridLayoutActivity.this,position+"",Toast.LENGTH_SHORT).show();
           }
       });
       //设置滚动相关的式样
//        mRecyclerView.setRefreshProgressStyle(ProgressStyle.LineScale);
//        mRecyclerView.setArrowImageView(R.mipmap.ic_launcher);
   }

   private void notifyDataSetChanged() {
       mLRecyclerViewAdapter.notifyDataSetChanged();
   }

   private void addItems(ArrayList<ItemModel> list) {
       mDataAdapter.addAll(list);
       mCurrentCounter += list.size();
   }

   private class PreviewHandler extends Handler {

       private WeakReference<EndlessGridLayoutActivity> ref;

       PreviewHandler(EndlessGridLayoutActivity activity) {
           ref = new WeakReference<>(activity);
       }

       @Override
       public void handleMessage(Message msg) {
           final EndlessGridLayoutActivity activity = ref.get();
           if (activity == null || activity.isFinishing()) {
               return;
           }

           switch (msg.what) {
               case -1:
                   int currentSize = activity.mDataAdapter.getItemCount();
                   //模拟组装40个数据
                   ArrayList<ItemModel> newList = new ArrayList<>();
                   for (int i = 0; i < 40; i++) {
                       if (newList.size() + currentSize >= TOTAL_COUNTER) {
                           break;
                       }
                       ItemModel item = new ItemModel();
                       item.id = currentSize + i;
                       item.title = "item" + (item.id);
                       newList.add(item);
                   }

                   activity.addItems(newList);
                   activity.mRecyclerView.refreshComplete(1);

                   break;
               case -2:
                   activity.notifyDataSetChanged();
                   break;
               case -3:
                   activity.mRecyclerView.refreshComplete(10);
                   activity.notifyDataSetChanged();
                   activity.mRecyclerView.setOnNetWorkErrorListener(new OnNetWorkErrorListener() {
                       @Override
                       public void reload() {
                           requestData();
                       }
                   });
                   break;
           }
       }
   }

   /**
    * 模拟请求网络
    */
   private void requestData() {
       new Thread() {
           @Override
           public void run() {
               super.run();
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               //如果网络正常,则
               mHandler.sendEmptyMessage(-1);
           }
       }.start();
   }

   @Override
   public boolean onPrepareOptionsMenu(Menu menu) {
       getMenuInflater().inflate(R.menu.menu_list_drag, menu);
       return true;
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       if (item.getItemId() == android.R.id.home) {
           finish();
       } else if (item.getItemId() == R.id.menu_grid) {
           mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
           mRecyclerView.setAdapter(mLRecyclerViewAdapter);//必须重新setAdapter

       } else if (item.getItemId() == R.id.menu_linear) {
           mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

       }
       return true;
   }
}
  • MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter {
   protected Context mContext;
   private LayoutInflater mInflater;

   protected List<ItemModel> mDataList = new ArrayList<>();
   private View itemView;

   public MyAdapter(Context context) {
       mContext = context;
       mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   }
   @NonNull
   @Override
   public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       itemView = mInflater.inflate(R.layout.sample_item_text, parent, false);
       return new MyViewHolder(itemView);
   }

   @Override
   public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
       ItemModel item = mDataList.get(position);
       TextView titleText = holder.itemView.findViewById(R.id.info_text);
       titleText.setText(item.title);
   }

   @Override
   public int getItemCount() {
       return mDataList.size();
   }

   private class MyViewHolder extends RecyclerView.ViewHolder {
       public MyViewHolder(View itemView) {
           super(itemView);
       }
   }

   public void addAll(ArrayList<ItemModel> list) {
       int lastIndex = this.mDataList.size();
       if (this.mDataList.addAll(list)) {
           notifyItemRangeInserted(lastIndex, list.size());
       }
   }

   public void clear() {
       mDataList.clear();
       notifyDataSetChanged();
   }
}
  • ItemModel.java
public class ItemModel  {
   public long id;
   public String title;
   public int imgRes;
   public String imgUrl;
   public int height ;
   public int type;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值