ViewPager 滚动滞后 Android
ViewPager scroll lagging in Android
我正在使用 ViewPager 显示各种 GridView,每个 GridView 都有一组图像。
我只是将所有图像复制并粘贴到 drawables 文件夹中,它们每个都有 300px X 300px,当在不同的网格之间滑动时,滑动滞后很多,我尝试将图像大小调整为一半,它变得更好但问题依旧。
然后我尝试使用这样的 AsyncTask 加载每个图像:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private Integer[] mSeries;
public ImageAdapter(Context c, int n) {
super();
this.mContext = c;
this.mSeries = ArrayImages.getImages(n);
}
public int getCount() {
return mSeries.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(200, 200));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setDrawingCacheEnabled(true);
new LoadImage(imageView, position).execute();
return imageView;
}
class LoadImage extends AsyncTask<Object, Void, Integer> {
private ImageView imv;
private int position;
public LoadImage(ImageView imv, int pos) {
this.imv = imv;
this.position = pos;
}
@Override
protected Integer doInBackground(Object... params) {
return mSeries[position];
}
@Override
protected void onPostExecute(Integer result) {
if(result != 0 && imv != null){
imv.setVisibility(View.VISIBLE);
imv.setImageResource(result);
}else{
imv.setVisibility(View.GONE);
}
}
}
但问题仍然存在,因为有 250 张图像,我制作了一些数组来保存它们,当我需要它们时,我只是问:ArrayImages.getImages(n)
不确定这是否是问题所在。
因为我的 FragmentPagerAdapter 必须创建所有 16 个 GridFragment 并获取这些数组:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private int NumbOfTabs = 16; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
// Build a Constructor and assign the passed Values to appropriate values in the class
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
//This method return the fragment for the every position in the View Pager
@Override
public Fragment getItem(int index) {
// TODO Auto-generated method stub
switch (index) {
case 0:
return new GridFragment(1);
case 1:
return new GridFragment(2);
...
case 16:
return new GridFragment(16);
我可以做些什么来改善加载并消除延迟?
我使用这个库从网络加载图像到适配器,它只有 3 个 类,你可以编辑它来加载你的本地图像,而且很容易实现。 https://github.com/thest1/LazyList
好的,所以在 Vinicius 向我介绍了一个库之后,但即使如此我也无法解决问题,我决定搜索其他库并找到 Picasso 库,它非常完美且易于加载图像,它可以完成所有工作适合你的工作。
我只是按照这个例子做了!
http://www.101apps.co.za/articles/gridview-tutorial-using-the-picasso-library.html
我正在使用 ViewPager 显示各种 GridView,每个 GridView 都有一组图像。
我只是将所有图像复制并粘贴到 drawables 文件夹中,它们每个都有 300px X 300px,当在不同的网格之间滑动时,滑动滞后很多,我尝试将图像大小调整为一半,它变得更好但问题依旧。
然后我尝试使用这样的 AsyncTask 加载每个图像:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private Integer[] mSeries;
public ImageAdapter(Context c, int n) {
super();
this.mContext = c;
this.mSeries = ArrayImages.getImages(n);
}
public int getCount() {
return mSeries.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(200, 200));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setDrawingCacheEnabled(true);
new LoadImage(imageView, position).execute();
return imageView;
}
class LoadImage extends AsyncTask<Object, Void, Integer> {
private ImageView imv;
private int position;
public LoadImage(ImageView imv, int pos) {
this.imv = imv;
this.position = pos;
}
@Override
protected Integer doInBackground(Object... params) {
return mSeries[position];
}
@Override
protected void onPostExecute(Integer result) {
if(result != 0 && imv != null){
imv.setVisibility(View.VISIBLE);
imv.setImageResource(result);
}else{
imv.setVisibility(View.GONE);
}
}
}
但问题仍然存在,因为有 250 张图像,我制作了一些数组来保存它们,当我需要它们时,我只是问:ArrayImages.getImages(n)
不确定这是否是问题所在。
因为我的 FragmentPagerAdapter 必须创建所有 16 个 GridFragment 并获取这些数组:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private int NumbOfTabs = 16; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
// Build a Constructor and assign the passed Values to appropriate values in the class
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
//This method return the fragment for the every position in the View Pager
@Override
public Fragment getItem(int index) {
// TODO Auto-generated method stub
switch (index) {
case 0:
return new GridFragment(1);
case 1:
return new GridFragment(2);
...
case 16:
return new GridFragment(16);
我可以做些什么来改善加载并消除延迟?
我使用这个库从网络加载图像到适配器,它只有 3 个 类,你可以编辑它来加载你的本地图像,而且很容易实现。 https://github.com/thest1/LazyList
好的,所以在 Vinicius 向我介绍了一个库之后,但即使如此我也无法解决问题,我决定搜索其他库并找到 Picasso 库,它非常完美且易于加载图像,它可以完成所有工作适合你的工作。
我只是按照这个例子做了!
http://www.101apps.co.za/articles/gridview-tutorial-using-the-picasso-library.html