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. [算法][包围盒]AABB简单类

    头文件: #pragma once #include <iostream> //一个假的点类型 struct Vector3 { float x; float y; float z; }; ...

  2. 标准类型String(学习中)

    1.读取string对象 #include<iostream> #include<cstring> using namespace std; int main() { stri ...

  3. (POJ2635)The Embarrassed Cryptographer(大数取模)

    The Embarrassed Cryptographer Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13041 Accep ...

  4. Obj格式解析以及在Unity3D下导入测试

    目前基本实现了导入,注意只能打开含有单个模型的obj文件 四边面模型: 全三角面模型(测试单一材质,自动分了下UV): 这里介绍下obj格式: obj格式是waveFront推出的一种3D模型格式,可 ...

  5. bzoj 2818: Gcd GCD(a,b) = 素数

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1566  Solved: 691[Submit][Status] Descript ...

  6. java提高篇---Vector

    对于List接口这里还介绍一个它的实现类Vector,Vector 类可以实现可增长的对象数组. 一.Vector简介 Vector可以实现可增长的对象数组.与数组一样,它包含可以使用整数索引进行访问 ...

  7. Winform容器标签 打印标签 对话框控件

    一.容器标签 布局: Anchor:锁定位置,指定与窗口容器的边缘位置,会随着窗口大小的改变而改变: Dock:填充窗口的位置.一般与容器标签同时使用. 1.Panel:对控件进行分组.可以独立布局, ...

  8. (3)redis队列功能

    Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpus ...

  9. spark1.4

    spark1.4 Windows local调试环境搭建总结 1.scala版本 scala-2.10.4 官方推荐 scala-2.11.7[不推荐,非sbt项目.需要后加载] 2.spark版本 ...

  10. 分分钟知道tiles框架是干嘛的

    分分钟知道tiles框架是干嘛的 http://blog.sina.com.cn/s/blog_a123d4d50101792d.html参考上面的文章,简单明了.让你一下子就知道这个是用来做什么的. ...