ViewPager刷新解析

  原本以为PagerAdapter类似于BaseAdapter 但是使用起来发现刷新还是有区别的 解析如下

先上Demo

PagerAdapter的四大函数

  getCount 返回要滑动的View的个数

  isViewFromObject 从当前container中删除指定位置(position)的View

  instantiateItem 将当前视图添加到container中 返回当前View

  destroyItem

第一个问题 但数据源发生变化时 调用viewPagerAdapter.notifyDataSetChanged() 发现无法刷新数据

解决办法 PagerAdapter中重写getItemPosition方法

上代码

public class MainActivity extends Activity {

  private ViewPager view_pager; //预览照片的分页显示
private ViewPagerAdapter viewPagerAdapter; //分页图片的预览器 private ArrayList<String> fileNames = new ArrayList<String>(); //本地图片路径
private int currentPosition; //当前选择的图片 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initData();
initView();
} // 获取本地所有照片路径
private void initData() { fileNames.clear();
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
byte[] data = cursor.getBlob(cursor.getColumnIndex(Media.DATA)); //图片的保存位置的数据
fileNames.add(new String(data, 0, data.length - 1));
} } //初始化控件
private void initView() {
view_pager = (ViewPager) findViewById(R.id.view_pager);
viewPagerAdapter = new ViewPagerAdapter(this, fileNames);
view_pager.setAdapter(viewPagerAdapter); view_pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override
public void onPageSelected(int i) {
currentPosition = i; Log.i("mbk", "翻页后的当前页面" + currentPosition);
} @Override
public void onPageScrolled(int i, float f, int j) {
} @Override
public void onPageScrollStateChanged(int i) {
}
}); Button delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
if (fileNames.size() > 0) {
fileNames.remove(currentPosition);
}
Log.i("mbk", "删除的当前页面" + currentPosition);
viewPagerAdapter.notifyDataSetChanged();
}
}); } }
public class ViewPagerAdapter extends PagerAdapter{

  private Context context;
private ArrayList<String> fileNames = new ArrayList<String>(); //本地图片路径 public ViewPagerAdapter(Context context, ArrayList<String> fileNames) {
super();
this.context = context;
this.fileNames = fileNames;
} @Override
public int getCount() {
return fileNames.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} @Override
public View instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(context);
Glide.with(context).load(fileNames.get(position)).centerCrop().into(imageView); container.addView(imageView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
return imageView;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} //解决数据不刷新的问题
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}

Demo见 https://github.com/huanyi0723/TestViewPager1

第二个问题 解决刷新单个页面的方法 对于控件采取setTag和findViewWithTag寻找到 再更新 同时注意position和currentPosition

上代码

public class MainActivity extends Activity {

  private ViewPager view_pager; //预览照片的分页显示
private ViewPagerAdapter viewPagerAdapter; //分页图片的预览器 private ArrayList<String> fileNames = new ArrayList<String>(); //本地图片路径
private int currentPosition = 0; //当前选择的图片 private Timer timer = new Timer(); // 定时器
private TimerTask timerTask;
private int progress = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initData();
initView();
} // 获取本地所有照片路径
private void initData() { fileNames.clear();
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
byte[] data = cursor.getBlob(cursor.getColumnIndex(Media.DATA)); //图片的保存位置的数据
fileNames.add(new String(data, 0, data.length - 1));
} } //初始化控件
private void initView() {
view_pager = (ViewPager) findViewById(R.id.view_pager);
viewPagerAdapter = new ViewPagerAdapter(this, fileNames, view_pager, currentPosition);
view_pager.setAdapter(viewPagerAdapter); view_pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override
public void onPageSelected(int i) {
currentPosition = i; Log.i("mbk", "翻页后的当前页面" + currentPosition);
} @Override
public void onPageScrolled(int i, float f, int j) {
} @Override
public void onPageScrollStateChanged(int i) {
}
}); Button delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
if (fileNames.size() > 0) {
fileNames.remove(currentPosition);
}
Log.i("mbk", "删除的当前页面" + currentPosition);
viewPagerAdapter.notifyDataSetChanged();
}
}); Button update = (Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
initTimeTask();
}
}); } // 定时器轮询
private void initTimeTask() { timerTask = new TimerTask() {
@Override
public void run() {
viewPagerAdapter.setProgress( progress , currentPosition); Log.i("mbk", "---------------MainActivity -----------progress--------------" + progress);
progress++;
}
}; timer.schedule(timerTask, 0, 1000); } }
public class ViewPagerAdapter extends PagerAdapter {

  private Context context;
private ArrayList<String> fileNames = new ArrayList<String>(); // 本地图片路径 private SeekBar seekBar;
private ViewPager view_pager; public ViewPagerAdapter(Context context, ArrayList<String> fileNames, ViewPager view_pager ) {
super();
this.context = context;
this.fileNames = fileNames;
this.view_pager = view_pager;
} @Override
public int getCount() {
return fileNames.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} @Override
public View instantiateItem(ViewGroup container, int position) { View view = LayoutInflater.from(context).inflate(R.layout.pager_adapter_item, null);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
seekBar = (SeekBar) view.findViewById(R.id.seekBar);
seekBar.setMax(100); seekBar.setTag("seekBar" + position); Log.i("mbk", "---------------ViewPagerAdapter -----------setTag--------------" + position); Glide.with(context).load(fileNames.get(position)).centerCrop().into(imageView); container.addView(view, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
return view; } @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} // 解决数据不刷新的问题
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
} public void setProgress(int progress, int currentPosition) {
seekBar = (SeekBar) view_pager.findViewWithTag("seekBar"+currentPosition);
seekBar.setProgress(progress); Log.i("mbk", "---------------ViewPagerAdapter -----------progress--------------" + progress);
}
}

Demo见 https://github.com/huanyi0723/TestViewPager2

Android ViewPager刷新解析的更多相关文章

  1. Android DiskLruCache 源代码解析 硬盘缓存的绝佳方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47251585: 本文出自:[张鸿洋的博客] 一.概述 依然是整理东西.所以最近 ...

  2. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  3. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  4. Android ViewPager 用法

    Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...

  5. Android ViewPager再探:增加滑动指示条

    上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...

  6. Android ViewPager初探:让页面滑动起来

    下一篇:<Android ViewPager再探:增加滑动指示条> ViewPager需要用到适配器PagerAAdapter,以下四个函数需要重写: instantiateItem(Vi ...

  7. [转] Android Volley完全解析(一),初识Volley的基本用法

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[-] Volley简介 下载Volley StringRequest的用法 JsonRequest的用法   转载请注明出处:http ...

  8. Android OkHttp完全解析 --zz

    参考文章 https://github.com/square/okhttp http://square.github.io/okhttp/ 泡网OkHttp使用教程 Android OkHttp完全解 ...

  9. Android IntentService完全解析 当Service遇到Handler

    一 概述 大家都清楚,在Android的开发中,凡是遇到耗时的操作尽可能的会交给Service去做,比如我们上传多张图,上传的过程用户可能将应用置于后台,然后干别的去了,我们的Activity就很可能 ...

随机推荐

  1. [BIM]BIM中IDM介绍

    参考:http://blog.fang.com/25866228/10613454/articledetail.htm IDM的全称是Information Delivery Manual,信息交付手 ...

  2. ACM题目————Find them, Catch them

    Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...

  3. RANSAC和Flitline

    [blog算法原理]RANSAC和FitLine ​ 如果已经有一系列图片,需要拟合出最为合适的一条直线出来,这个时候你会选择RANSAC还是FitLine. 一.算法定义: RANSAC是实际运用非 ...

  4. Unix下五种IO模型

    http://blog.chinaunix.net/uid-25324849-id-247813.html 1. I/O模型 Unix下共有五种I/O模型 a. 阻塞I/O b. 非阻塞I/O c. ...

  5. JAVA基础知识之JVM-——URLClassLoader

    URLClassLoader是ClassLoader的一个实现类,它既能从本地加载二进制文件类,也可以从远程加载类. 它有两个构造函数, 即 URLClassLoader(URL[] urls),使用 ...

  6. 第十四章:高级I/O

    14.1:引言 本章内容包括非阻塞I/O.记录锁.系统V流机制.I/O多路转接(select和poll函数).readv和writev函数以及存储映射I/O(mmap),这些都称为高级I/O. 14. ...

  7. Entity Framework 第六篇 分页查询

    目前分页支持单表 , ) where TEntity : class { ) * size; var _reset = Get(filter, orderBy); total = _reset.Cou ...

  8. OS开发(Objective-C)常用库索引

    code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 cocoacontrols.com/ 英文版本的lib收集 objclibs.com/ 精品lib的收集网站 h ...

  9. jquery之event与originalEvent的关系、event事件对象用法浅析

    在jquery中,最终传入事件处理程序的 event 其实已经被 jQuery 做过标准化处理, 其原有的事件对象则被保存于 event 对象的 originalEvent 属性之中, 每个 even ...

  10. TCP的流量控制和拥塞控制

    1.TCP的流量控制 一般说来,我们总是希望数据传输的更快一些.但如果发送方吧数据发送的过快,接收方就可能来不及接收,就会造成数据的丢失.所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来的及 ...