android分页加载重要吗,android九宫格可分页加载控件使用详解

本文详细介绍了如何在Android中实现一个九宫格可分页加载的控件,使用了ViewPager结合GridView,每一页ViewPager包含一个GridView,数据以List<List<T>>形式存储。控件具备高度自适应,动态创建内部视图,并提供了接口用于数据刷新和分页加载。在实际使用时,首先初始化所有数据,然后在每次分页加载时请求新的数据并更新页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

25a79825d341f4a4927c6a2e5260e35d.png

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

使用方法

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

viewPager = findViewById(R.id.ninePages);

//数据初始化

List> lists = new ArrayList<>();

for (int i = 0; i < 6; i++) {//页数

List 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() {

@Override

public void request(int position) {//分页加载

List 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 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 extends LinearLayout {

private View mView;

private ViewPager viewPager;

private Context context;

private List> list = new ArrayList<>();

//已经请求过的,不在重复请求

private List 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) {

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 changeList){

list.set(position, changeList);

adapter.notifyDataSetChanged();

}

}

viewpager适配器:

public class MyViewPagerAdapter extends PagerAdapter {

private Context context;

private List> list;

private LayoutInflater inflater;

private MyGridViewAdapter adapter;

private int currentPosition;

private RequestDataListener listener;

public MyViewPagerAdapter(Context context, List> 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 extends BaseAdapter{

private Context context;

private List list;

private LayoutInflater inflater;

private RequestDataListener listener;

public MyGridViewAdapter(Context context, List 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 {

void request(int position);

//gridView列数

int gridViewColumn();

View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent, List list);

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在 Android 应用开发中,开发一款仿 OPPO 手机计算器的应用是极具实践价值的任务,它融合了 UI 设计、事件处理以及数学逻辑等多方面的技术要点。当前的“最新版仿 OPPO 手机计算器--android.rar”压缩包中,提供了该计算器应用的源代码,这为开发者深入学习 Android 编程提供了宝贵的资源。 UI 设计是构建此类计算器应用的基石。OPPO 手机的计算器界面以清晰的布局和良好的用户交互体验著称,其中包括数字键、运算符键以及用于显示结果的区域等关键元素。开发者需借助 Android Studio 中的 XML 布局文件来定义这些界面元素,可选用 LinearLayout、GridLayout 或 ConstraintLayout 等布局管理器,并搭配 Button 控件来实现各个按键功能。同时,还需考虑不同分辨率屏幕和设备尺寸的适配问题,这通常涉及 Density Independent Pixel(dp)单位的应用以及 Android 尺寸资源的合理配置。 事件处理构成了计算器的核心功能。开发者要在每个按钮的点击事件中编写相应的处理代码,通常通过实现 OnClickListener 接口来完成。例如,当用户点击数字键时,相应的值会被添加到显示区域;点击运算符键时,则会保存当前操作数并设定运算类型。而对于等号(=)按钮,需要执行计算操作,这往往需要借助栈数据结构来存储操作数和运算符,并运用算法解析表达式以完成计算。 数学逻辑的实现则是计算器功能的关键体现。在 Android 应用中,开发者可以利用 Java 内置的 Math 类,或者自行设计算法来完成计算任务。基本的加减乘除运算可通过简单的算术操作实现,而像求幂、开方等复杂运算则需调用 Math 类的相关方法。此外
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值