2014-09-08 3 views
1

У меня есть демонстрационная активность, которая по сути представляет собой сборник из 5 изображений. Я сохранил их в моем каталоге /drawable. Я использую пользовательские реализации FragmentPagerAdapter, потому что у меня есть статический набор фрагментов страницы через:ViewPager с ImageViews: страницы не читаются плавно

private class MyPagerAdapter extends FragmentPagerAdapter { 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int pos) { 
     return SDemoFragment.newInstance(pos); 
    } 

    @Override 
    public int getCount() { 
     return 5; 
    } 
} 

У меня есть собственная реализация Fragment, а также. В настоящее время у меня есть один макет ImageView, который я раздуваю, и в зависимости от mNum источник изображения установлен в одну из моих графических чертежей.

public class SDemoFragment extends Fragment { 
    int mNum = 0; 

    /** 
    * Create a new instance of CountingFragment, providing "num" as an 
    * argument. 
    */ 
    public static SDemoFragment newInstance(int num) { 
     SDemoFragment f = new SDemoFragment(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

    /** 
    * When creating, retrieve this instance's number from its arguments. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) 
      mNum = getArguments().getInt("num"); 
    } 

    /** 
    * The Fragment is created here. 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.pager_item_fragment, container, 
       false); 
     ImageView x = (ImageView) v.findViewById(R.id.pagerItemImage); 

     switch (mNum) { 
     case 0: 
      x.setImageResource(R.drawable.demo0); 
      break; 
     case 1: 
      x.setImageResource(R.drawable.demo1); 
      break; 
     case 2: 
      x.setImageResource(R.drawable.demo2); 
      break; 
     case 3: 
      x.setImageResource(R.drawable.demo3); 
      break; 
     case 4: 
      x.setImageResource(R.drawable.demo4); 
      break; 
     } 
     return x; 

    } 
} 

Код для простого макета изображения: pager_item_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pagerItemImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:contentDescription="Tutorial" 
    android:src="@drawable/demo0" /> 

Есть ли причина, почему каждый раз, когда я красть от одного изображения к другому, она отстает? Есть ли проблема с памятью или с использованием правильного метода или вызывается inflater.inflate(...); каждый раз, когда вызывается onCreateView()? Любая помощь будет оценена, и если вам нужно больше разделов моего кода, не стесняйтесь спрашивать. Благодаря!

Обновление: теперь я регулярно получаю OutOfMemoryException.

+0

Вы прочитали это? http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – 2Dee

+0

Это было прекрасно, спасибо! – sarangj

ответ

1

Вы можете использовать шаблон ViewHolder для минимизации просмотра вида. Кроме того, разгружая изображения декодирования на AsyncTask помогло бы много:

public View getView(int position, View v, ViewGroup parent) { 
    // Need to do this only once per each view. 
    ViewHolder viewHolder = new ViewHolder(); 
    holder.mView = v.findViewById(R.id.pagerItemImage); 
    holder.mPosition = position; 

    new GetImageTask(position, holder).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); 
    return v; 
} 

private static class GetImageTask extends AsyncTask { 

    private int mPosition; 
    private ViewHolder mHolder; 

    public GetImageTask(int pos, ViewHolder holder) { 
     mPosition = pos; 
     mHolder = holder; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... arg0) { 
     return BitmapFactory.decodeResource(getResources(), R.drawable.image); 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     // Update the appropriate slide 
     if (mHolder.position == mPosition) { 
      // To be reconsidered. You can either set the returned image at runtime, and set it 
      // for your view, or you can store it inside the ViewHolder. 
      mHolder.view.setImageBitmap(bitmap); 
     } 
    } 
} 


// This will hold all the data for you views. 
private static class ViewHolder { 
    private Bitmap mBitmap; 
    private int mPosition; 
    private View mView; 
} 

Пожалуйста, обратите внимание, что это будет хранить растровые изображения. Вполне возможно, вы получите OutOfMemory в некоторых точках. Для этого потребуется более достойный способ приблизиться. Например, вы должны сохранить только ваш текущий вид и его соседей при некотором смещении.

Этот псевдокод может быть немного не офлайновым, но должен быть достаточным для отображения общей идеи. Подробные сведения о ViewHolders см. В разделе Smooth Scrollin - Android Developer, так как просмотр пейджера/флиппера будет почти таким же, как listview.

+0

Спасибо! Я думаю, мне просто нужно было начать использовать «BitmapFactory.decode *()», и моя проблема была решена. Я не думаю, что мне еще нужно использовать «ViewHolders», но спасибо! – sarangj

Смежные вопросы