android九宮格可分頁(yè)加載控件使用詳解
本文實(shí)例為大家分享了android九宮格可分頁(yè)加載控件的具體實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下
基本思路是viewpager+gridview,每一頁(yè)viewpager視圖有一個(gè)gridview,gridview加載九格。所以要保證數(shù)據(jù)的準(zhǔn)確性。數(shù)據(jù)以List< List < T>>的形式??丶?shí)現(xiàn)了高度自適應(yīng),根據(jù)控件的個(gè)數(shù),計(jì)算控件的高度。內(nèi)部的viewpager和gridview視圖都以動(dòng)態(tài)創(chuàng)建,無(wú)需新建一個(gè)xml文件,整個(gè)控件只需要一個(gè)item的布局文件。
使用方法
使用時(shí)可以先請(qǐng)求一個(gè)接口,需初始化數(shù)據(jù),數(shù)據(jù)初始化需要根據(jù)總個(gè)數(shù)初始化所有數(shù)據(jù),在每次分頁(yè)加載的時(shí)候,再通過(guò)請(qǐng)求當(dāng)頁(yè)的數(shù)據(jù),更改數(shù)據(jù),刷新頁(yè)面。
viewPager = findViewById(R.id.ninePages); //數(shù)據(jù)初始化 List<List<TestEntity>> lists = new ArrayList<>(); for (int i = 0; i < 6; i++) {//頁(yè)數(shù) List<TestEntity> list1 = new ArrayList<>(); for (int j = 0; j < 9; j++) {//每頁(yè)個(gè)數(shù) TestEntity entity = new TestEntity(); entity.setText("j=" + j + "/i=" + i); list1.add(entity); } lists.add(list1); } //設(shè)置不每頁(yè)重復(fù)加載 viewPager.setEveryRequest(false); //設(shè)置分頁(yè)加載 viewPager.setPagingLoad(true); viewPager.setListener(new RequestDataListener<TestEntity>() { @Override public void request(int position) {//分頁(yè)加載 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);要在最后調(diào)用
視圖控件:
public class NinePagesPagination<T> extends LinearLayout { private View mView; private ViewPager viewPager; private Context context; private List<List<T>> list = new ArrayList<>(); //已經(jīng)請(qǐng)求過(guò)的,不在重復(fù)請(qǐng)求 private List<Integer> hasAdded = new ArrayList<>(); //是否每次請(qǐng)求 private boolean isEveryRequest; //是否進(jìn)行分頁(yè)加載 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) {//分頁(yè)加載 if (isEveryRequest) {//每次都請(qǐng)求 adapter.setCurrentPosition(position); listener.request(position); } else {//請(qǐng)求過(guò)一次將不在重復(fù)請(qǐng)求 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立即刷新頁(yè)面 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; //計(jì)算item的寬 if(listener != null &listener.gridViewColumn() != 0){ width = parent.getWidth()/listener.gridViewColumn(); }else{ width = parent.getWidth()/3; } //設(shè)置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); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android端代碼量非常小的分頁(yè)加載庫(kù)
- Android編程實(shí)現(xiàn)分頁(yè)加載ListView功能示例
- Android中ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)
- Android基于ListView實(shí)現(xiàn)類似Market分頁(yè)加載效果示例
- Android之ListView分頁(yè)加載數(shù)據(jù)功能實(shí)現(xiàn)代碼
- Android實(shí)現(xiàn)基于滑動(dòng)的SQLite數(shù)據(jù)分頁(yè)加載技術(shù)(附demo源碼下載)
- Android應(yīng)用中ListView利用OnScrollListener分頁(yè)加載數(shù)據(jù)
- Android中ListView如何分頁(yè)加載數(shù)據(jù)
- Android實(shí)現(xiàn)ListView分頁(yè)加載數(shù)據(jù)
相關(guān)文章
Android仿微信文章懸浮窗效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android仿微信文章懸浮窗效果的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-10-10Flutter自定義實(shí)現(xiàn)神奇動(dòng)效的卡片切換視圖的示例代碼
這篇文章主要介紹了Flutter自定義實(shí)現(xiàn)神奇動(dòng)效的卡片切換視圖的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04Android WebView如何判斷是否滾動(dòng)到底部
大家好,本篇文章主要講的是Android WebView如何判斷是否滾動(dòng)到底部,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Android RecycleView滑動(dòng)停止后自動(dòng)吸附效果的實(shí)現(xiàn)代碼(滑動(dòng)定位)
這篇文章主要介紹了Android RecycleView滑動(dòng)停止后自動(dòng)吸附效果的實(shí)現(xiàn)代碼(滑動(dòng)定位),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Android實(shí)現(xiàn)流動(dòng)的漸變色邊框效果
本文將帶大家學(xué)習(xí)一下如何利用toast中的motion_toast組件實(shí)現(xiàn)一個(gè)流動(dòng)的漸變色邊框效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Android布局中g(shù)ravity與layout_gravity屬性說(shuō)明
這篇文章主要介紹了Android布局中g(shù)ravity與layout_gravity屬性說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01