Android ViewPager刷新解析
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刷新解析的更多相关文章
- Android DiskLruCache 源代码解析 硬盘缓存的绝佳方案
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47251585: 本文出自:[张鸿洋的博客] 一.概述 依然是整理东西.所以最近 ...
- Android Service完全解析,关于服务你所需知道的一切(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- Android Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
- Android ViewPager 用法
Android ViewPager 用法 场景:一般第一次打开应用程序时,程序会有一个提示页来给展现应用程序都有哪些功能:或者程序更新时,又更新哪些新特性,都可以使用ViewPager Demo 描述 ...
- Android ViewPager再探:增加滑动指示条
上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...
- Android ViewPager初探:让页面滑动起来
下一篇:<Android ViewPager再探:增加滑动指示条> ViewPager需要用到适配器PagerAAdapter,以下四个函数需要重写: instantiateItem(Vi ...
- [转] Android Volley完全解析(一),初识Volley的基本用法
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] Volley简介 下载Volley StringRequest的用法 JsonRequest的用法 转载请注明出处:http ...
- Android OkHttp完全解析 --zz
参考文章 https://github.com/square/okhttp http://square.github.io/okhttp/ 泡网OkHttp使用教程 Android OkHttp完全解 ...
- Android IntentService完全解析 当Service遇到Handler
一 概述 大家都清楚,在Android的开发中,凡是遇到耗时的操作尽可能的会交给Service去做,比如我们上传多张图,上传的过程用户可能将应用置于后台,然后干别的去了,我们的Activity就很可能 ...
随机推荐
- python怎么装模块
windows下 最简单的方法: File---Settings--Project ---Project Interpreter 下----点击 +号,输入你需要安装的模块名,点击Install P ...
- Linux上部署Tomcat(包括JAVA环境的配置)
一. 用FTP工具,把apache-tomcat-7.0.64.tar.gz,jdk-7u79-linux-x64.tar.gz 上传到目录/home/zwl/Tomcat/命令下 因为Tomcat运 ...
- 获取SqlServer2005表结构(字段,主键,外键,递增,描述)
1.获取表的基本字段属性 --获取SqlServer中表结构 SELECT syscolumns.name,systypes.name,syscolumns.isnullable, syscolumn ...
- PHP和ajax详解
优点:减轻服务器的负担,按需取数据,最大程度的减少冗余请求局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验基于xml标准化,并被广泛支持,不需安装插件等进一步促进页面和数据的分离缺点:A ...
- jquery闭包的使用
<div id="divTest"> Test </div> <br /> <hr /> <div id="divT ...
- js判断用户浏览器是PC还是手机,自动跳转
browserRedirect(); function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); ...
- Jquery中的filter()详细说明和transition的用法
filter() 方法将匹配元素集合缩减为匹配指定选择器的元素. 详细说明 如果给定表示 DOM 元素集合的 jQuery 对象,.filter() 方法会用匹配元素的子集构造一个新的 jQuery ...
- hnu Dirichlet's Theorem
/* 求ax+b x属于区间[L,R];范围内素数的个数. a*R+b<=10^12 ; R-L+1<=10^6 枚举,超时. 1.如果GCD(a,b)>1 那么a+b 2*a+b ...
- 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) B
链接:http://codeforces.com/gym/101116 学弟做的,以后再补 #include <iostream> #include <stdio.h> #in ...
- await和async关键字来写异步程序
await和async关键字出现于.Net5.0,方便写异步程序. 例子: public class MyClass { public MyClass() { DisplayValue(); //这里 ...