溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android中如何使用九宮格可分頁加載控件

發(fā)布時間:2021-09-27 11:38:16 來源:億速云 閱讀:136 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關android中如何使用九宮格可分頁加載控件,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

基本思路是viewpager+gridview,每一頁viewpager視圖有一個gridview,gridview加載九格。所以要保證數(shù)據(jù)的準確性。數(shù)據(jù)以List< List < T>>的形式??丶崿F(xiàn)了高度自適應,根據(jù)控件的個數(shù),計算控件的高度。內(nèi)部的viewpager和gridview視圖都以動態(tài)創(chuàng)建,無需新建一個xml文件,整個控件只需要一個item的布局文件。

使用方法

使用時可以先請求一個接口,需初始化數(shù)據(jù),數(shù)據(jù)初始化需要根據(jù)總個數(shù)初始化所有數(shù)據(jù),在每次分頁加載的時候,再通過請求當頁的數(shù)據(jù),更改數(shù)據(jù),刷新頁面。

viewPager = findViewById(R.id.ninePages);    //數(shù)據(jù)初始化    List<List<TestEntity>> lists = new ArrayList<>();    for (int i = 0; i < 6; i++) {//頁數(shù)      List<TestEntity> list1 = new ArrayList<>();      for (int j = 0; j < 9; j++) {//每頁個數(shù)        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);        }        //數(shù)據(jù)刷新        viewPager.dataInvalidate(position,changeList);      }      @Override      public int gridViewColumn() {//gridview列數(shù)        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<>();  //已經(jīng)請求過的,不在重復請求  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);        }      }    });  }  //數(shù)據(jù)刷新  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列數(shù)  int gridViewColumn();  View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent, List<T> list);}

關于“android中如何使用九宮格可分頁加載控件”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI