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); } }