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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM