android九宫格可分页加载控件使用详解

作者:poorSir 时间:2022-03-04 08:14:02 

本文实例为大家分享了android九宫格可分页加载控件的具体实现代码,供大家参考,具体内容如下

android九宫格可分页加载控件使用详解

github地址

基本思路是viewpager+gridview,每一页viewpager视图有一个gridview,gridview加载九格。所以要保证数据的准确性。数据以List< List < T>>的形式。控件实现了高度自适应,根据控件的个数,计算控件的高度。内部的viewpager和gridview视图都以动态创建,无需新建一个xml文件,整个控件只需要一个item的布局文件。

使用方法

使用时可以先请求一个接口,需初始化数据,数据初始化需要根据总个数初始化所有数据,在每次分页加载的时候,再通过请求当页的数据,更改数据,刷新页面。


viewPager = findViewById(R.id.ninePages);
   //数据初始化
   List<List<TestEntity>> lists = new ArrayList<>();
   for (int i = 0; i < 6; i++) {//页数
     List<TestEntity> list1 = new ArrayList<>();
     for (int j = 0; j < 9; j++) {//每页个数
       TestEntity entity = new TestEntity();
       entity.setText("j=" + j + "/i=" + i);
       list1.add(entity);
     }
     lists.add(list1);
   }
   //设置不每页重复加载
   viewPager.setEveryRequest(false);
   //设置分页加载
   viewPager.setPagingLoad(true);
   viewPager.setListener(new RequestDataListener<TestEntity>() {
     @Override
     public void request(int position) {//分页加载
       List<TestEntity> changeList =new ArrayList<>();
       for (int i = 0; i < 9; i++) {
         TestEntity testEntity = new TestEntity();
         testEntity.setText("change" + i);
         changeList.add(testEntity);
       }
       //数据刷新
       viewPager.dataInvalidate(position,changeList);
     }

@Override
     public int gridViewColumn() {//gridview列数
       return 3;
     }

@Override
     public View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent, List<TestEntity> list) {
       ViewHolder viewHolder = null;
       if(convertView == null){
         convertView = inflater.inflate(R.layout.item_gridview,parent,false);
         viewHolder = new ViewHolder();
         viewHolder.textView = convertView.findViewById(R.id.textview);
         convertView.setTag(viewHolder);
       }else{
         viewHolder = (ViewHolder) convertView.getTag();
       }
       viewHolder.textView.setText(list.get(position).getText());
       return convertView;
     }
   });
    viewPager.setList(lists);
class ViewHolder{
   private TextView textView;
 }

注意:viewPager.setList(lists);要在最后调用

视图控件:


public class NinePagesPagination<T> extends LinearLayout {
 private View mView;
 private ViewPager viewPager;
 private Context context;
 private List<List<T>> list = new ArrayList<>();
 //已经请求过的,不在重复请求
 private List<Integer> hasAdded = new ArrayList<>();
 //是否每次请求
 private boolean isEveryRequest;
 //是否进行分页加载
 private boolean isPagingLoad;
 private RequestDataListener listener;
 private MyViewPagerAdapter adapter;
 private ViewPager.OnPageChangeListener pageChangeListener;
 public NinePagesPagination(Context context, @Nullable AttributeSet attrs) {
   super(context, attrs);
   this.context = context;
   viewPager = new ViewPager(context);
   LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
   viewPager.setLayoutParams(params);
   mView = viewPager;
   addView(mView);
 }

@Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   if(listener!=null && listener.gridViewColumn() != 0){
     int column = listener.gridViewColumn();
     int row = (int) Math.ceil((double) list.get(0).size()/column);
     int heightMeasureSpec2 = MeasureSpec.makeMeasureSpec(row*getWidth()/column,
         MeasureSpec.AT_MOST);
     setMeasuredDimension(widthMeasureSpec,heightMeasureSpec2);
   }
 }

public void setListener(RequestDataListener listener) {
   this.listener = listener;
 }

public void setPageChangeListener(ViewPager.OnPageChangeListener pageChangeListener) {
   this.pageChangeListener = pageChangeListener;
 }

public void setEveryRequest(boolean everyRequest) {
   isEveryRequest = everyRequest;
 }

public void setPagingLoad(boolean pagingLoad) {
   isPagingLoad = pagingLoad;
 }

public void setList(List<List<T>> list) {
   this.list = list;
   initView();
   invalidate();
 }

private void initView() {
   adapter = new MyViewPagerAdapter(context, list,listener);
   viewPager.setAdapter(adapter);
   viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
       if(pageChangeListener != null){
         pageChangeListener.onPageScrolled(position,positionOffset,positionOffsetPixels);
       }
     }

@Override
     public void onPageSelected(int position) {
       if(pageChangeListener != null){
         pageChangeListener.onPageSelected(position);
       }
       if (isPagingLoad) {//分页加载
         if (isEveryRequest) {//每次都请求
           adapter.setCurrentPosition(position);
           listener.request(position);
         } else {//请求过一次将不在重复请求
           if (!hasAdded.contains(position)) {
             hasAdded.add(position);
             adapter.setCurrentPosition(position);
             listener.request(position);
           }
         }
       }
     }

@Override
     public void onPageScrollStateChanged(int state) {
       if(pageChangeListener != null){
         pageChangeListener.onPageScrollStateChanged(state);
       }
     }
   });
 }
 //数据刷新
 public void dataInvalidate(int position,List<T> changeList){
   list.set(position, changeList);
   adapter.notifyDataSetChanged();
 }
}

viewpager适配器:


public class MyViewPagerAdapter<T> extends PagerAdapter {
 private Context context;
 private List<List<T>> list;
 private LayoutInflater inflater;
 private MyGridViewAdapter adapter;
 private int currentPosition;
 private RequestDataListener listener;
 public MyViewPagerAdapter(Context context, List<List<T>> list,RequestDataListener listener) {
   this.context = context;
   this.list = list;
   this.listener = listener;
   inflater = LayoutInflater.from(context);
 }

@Override
 public int getCount() {
   return list.size();
 }

@Override
 public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
   return view == object;
 }

@NonNull
 @Override
 public Object instantiateItem(@NonNull ViewGroup container, int position) {
   GridView view = new GridView(context);
   ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
   view.setLayoutParams(params);
   view.setTag(position);
   if(listener!=null && listener.gridViewColumn() != 0){
     view.setNumColumns(listener.gridViewColumn());
   }
   adapter = new MyGridViewAdapter(context, list.get(position),listener);
   view.setAdapter(adapter);
   container.addView(view);
   return view;
 }

@Override
 public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
   container.removeView((View) object);
 }

@Override
 public int getItemPosition(@NonNull Object object) {
   //viewpager立即刷新页面
   if (list != null && list.size() == 0) {
     return POSITION_NONE;
   }
   View view = (View) object;
   if (currentPosition == (Integer) view.getTag()) {
     return POSITION_NONE;
   } else {
     return POSITION_UNCHANGED;
   }
 }

@Override
 public void notifyDataSetChanged() {
   super.notifyDataSetChanged();
   if(adapter != null){
     adapter.notifyDataSetChanged();
   }
 }

public void setCurrentPosition(int currentPosition) {
   this.currentPosition = currentPosition;
 }
}

gridview适配器


public class MyGridViewAdapter<T> extends BaseAdapter{
 private Context context;
 private List<T> list;
 private LayoutInflater inflater;
 private RequestDataListener listener;
 public MyGridViewAdapter(Context context, List<T> list,RequestDataListener listener){
   this.context = context;
   this.list = list;
   this.listener = listener;
   inflater = LayoutInflater.from(context);
 }
 @Override
 public int getCount() {
   return list.size();
 }

@Override
 public Object getItem(int position) {
   return list.get(position);
 }

@Override
 public long getItemId(int position) {
   return position;
 }

@Override
 public View getView(int position, View convertView, ViewGroup parent) {
   convertView = listener.getView(inflater,position,convertView,parent,list);
   int width;
   //计算item的宽
   if(listener != null &listener.gridViewColumn() != 0){
      width = parent.getWidth()/listener.gridViewColumn();
   }else{
      width = parent.getWidth()/3;
   }
   //设置item的宽高相等
   convertView.setLayoutParams(new AbsListView.LayoutParams(width,width));
   return convertView;
 }
}

暴露的接口


public interface RequestDataListener<T> {
 void request(int position);
 //gridView列数
 int gridViewColumn();
 View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent, List<T> list);
}

来源:https://blog.csdn.net/qq_31433525/article/details/82252232

标签:android,九宫格,分页加载
0
投稿

猜你喜欢

  • 详解SpringBoot程序启动时执行初始化代码

    2022-05-07 13:36:05
  • c#多线程网络聊天程序代码分享(服务器端和客户端)

    2022-08-10 00:32:48
  • JAVA随机打乱数组顺序的方法

    2023-08-11 18:56:03
  • Java实现Excel导入导出的步骤详解

    2022-09-05 05:20:32
  • Mybatis参数传递示例代码

    2023-05-20 09:43:08
  • 以Java代码的方式总结几个典型的内存溢出案例

    2023-06-11 04:00:56
  • 基于springboot+vue实现垃圾分类管理系统

    2023-04-17 08:39:11
  • java中struts2实现文件上传下载功能实例解析

    2022-03-31 06:47:38
  • ADO.NET实体数据模型详细介绍

    2023-10-16 12:15:41
  • Android如何禁止向EditText控件中输入内容详解

    2021-07-29 05:01:11
  • Android使用Handler和Message更新UI

    2023-01-13 21:22:21
  • RocketMQ broker 消息投递流程处理PULL_MESSAGE请求解析

    2021-11-18 17:12:49
  • 学习Java内存模型JMM心得

    2023-11-28 20:56:17
  • 如何实现Java中一个简单的LinkedList

    2023-03-12 11:55:02
  • C#语言async await工作原理示例解析

    2021-07-25 08:47:23
  • Android实现掷骰子效果

    2022-06-16 01:09:16
  • Java事件监听机制讲解

    2022-09-18 00:41:11
  • 解决myBatis返回integer值的问题

    2022-07-23 18:17:38
  • 详解Springboot对多线程的支持

    2023-09-21 02:18:21
  • springboot整合通用Mapper简化单表操作详解

    2022-08-19 19:24:19
  • asp之家 软件编程 m.aspxhome.com