Android PagerAdapter刷新当前显示布局

Android PagerAdapter刷新当前显示布局

PagerAdapter基本写法

主要重写这四个方法,再将adapter设置到pageview中就可以显示可滑动的view了。

public class MyAdapter extends PagerAdapter {
	list<Map<String,String>> data;
	Context context;
	LayoutInflater inflater;

	public MyAdapter(List<Map<String,String>> data,Context context){
		this.data = data;
		this.context = context;
		inflater = LayoutInflater.from(context);
	}
	
   	@Override
    public int getCount() {
        return data.size();
    }
    
 	@Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

 	@Override
    public Object instantiateItem(ViewGroup container, int position) {
		Map<String,String> map = data.get(position);
		//创建view
		View view = inflater.inflate(R.layout.pageradapter_item, container, false);
		//其它布局操作
		View xxView = view.findViewById(R.id.xx_view);
		if(map.get("aa") == xxx){
			xxView.setXX;
		}else{
			xxView.setYY;
		}
		...
		//将view加入PageView中
 		container.addView(view);
        return view;
	}

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

adapter中是通过instantiateItem()方法来创建一页显示的view,和ListView使用的adapter的getView() 方法类似。但是ListView的adapter当数据改变的时候可以调用notifyDataSetChanged()方法来更新布局,PagerAdapter单调用notifyDataSetChanged()却没有效果。
在instantiateItem()方法中打上断点,执行发现创建PageView的时候会调用三次这个方法,position分别是0,1,2。后面每次向后滑动PageView时会调用一次方法,position是3,4,5…PageView每次会缓存3个View(可以设置),前面的view会调用destroyItem()销毁。

刷新布局

首先要获取当前布局currentView,重写PagerAdapter的setPrimaryItem方法,其中object对象就是当前显示的页面View对象,把他强转后用全局变量保存下来。

 @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        super.setPrimaryItem((View) container, position, object);
        mCurrentView = (View) object;
    }

然后可以写一个供外面调用的方法,通知adapter刷新数据,这里给当前显示的view设置一个tag

    public void setStatus(int id) {
        mCurrentView.setTag("changed");
        this.notifyDataSetChanged();
    }

重点来了,重写getItemPosition方法,在遇到我们设置了tag的view返回POSITION_NONE,这样adapter在调用notifyDataSetChanged时就会销毁这个view并重新绘制。

    @Override
    public int getItemPosition(Object object) {
        if ("changed".equals(((View) object).getTag())) {
            return POSITION_NONE;
        }
        return POSITION_UNCHANGED;
    }

这样如果写好了 instantiateItem(BaseAdapter的getView)方法, 在Activity中调用adapter的setStatus方法就可以刷新当前布局显示了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值