2015-04-15 5 views
3

Внутри dialogFragment У меня есть viewPager с двумя страницами. Каждая страница содержит пользовательский адаптер. Один адаптер со списком прядильщиков, другой адаптер со списком EditTexts. ViewPager добавляет адаптеры в порядке.Почему мой ViewPager работает так медленно?

public class PageFragment extends Fragment { 
    ... 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.pagefragment_newprod, null); 

    LinearLayout ll=(LinearLayout) view.findViewById(R.id.tvLL); 
    ListView listView=new ListView(getActivity()); 
    ll.addView(listView); 

    if (pageNumber==0){ 
     dropDownAdapter=new DropDownAdapter(getActivity(), fillListAdapter); 
     listView.setAdapter(dropDownAdapter); 
    } else if (pageNumber==1){ 
     boxAdapter = new BoxAdapter(getActivity(), filledFields); 
     listView.setAdapter(boxAdapter); 
    } 
    return view; 
    } 
} 

Но он работает медленно! Текущий адаптер (я имею в виду на странице curren) создает представления каждые миллисекунды! Посмотрите на это:

public class BoxAdapter extends BaseAdapter{ 
... 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if (view == null) { 
     view = lInflater.inflate(R.layout.addproduct_item, parent, false); 
    } 
    Log.d(LOG_TAG, "====As I said every milisecond...======"); 
    EditText editText = (EditText) view.findViewById(R.id.addProductEditText); 
    editText.setText(p.value); 
    return view; 
    } 
} 

Даже когда я сфокусировал EditText, этот Log.d пишет сообщения каждые миллисекунды! Кроме того, работает адаптер на следующей странице. У меня есть другой Log.d на другом адаптере getView, и он работает, когда я использовал адаптер другой страницы!

Пожалуйста, помогите мне понять, что это неправильно ... (

+2

Ознакомьтесь с шаблоном держателя Android (http://developer.android.com/training/improving-layouts/smooth-scrolling.html). Вы должны использовать его в своем «ViewPager». – moictab

+0

Кроме того, использование фрагментов внутри viewPager занимает больше времени для создания, занимает больше памяти и сложнее отлаживать эти пользовательские представления (-> изменить страницы ViewPager на customView вместо фрагментов). Вы также можете заполнить свой список (создать адаптер, установить его) в asynctask. –

+1

Недостаточно кода, чтобы выяснить, что не так. Скорее всего, у вас есть некоторый цикл (возможно, неопределенный), который добавляет данные в ваш адаптер списка, и это приводит к обширным вызовам notifyDatasetChanged() вашего адаптера. – mykolaj

ответ

2

вопрос уже решен в комментариях. Решение для ОП, по-видимому, чтобы удалить сложные фрагменты и их адаптер. Однако, я также имел сложные фрагменты в закладке макете с ViewPager, и следующим решением фиксированных медленной задачей подкачки:

viewPager.setOffscreenPageLimit(2); 

2 будет держать две страниц от текущей страницы в памяти Это было достаточно для меня, потому что у меня было три. Однако будьте осторожны при хранении слишком большого количества страниц в памяти. См. раздел documentation.

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