ViewPagers в ListView, показывающий элементы пустого списка

[РЕДАКТИРОВАТЬ] : Спасибо за все содержательные ответы, проблема теперь решена, спасибо вашей помощи. Аналогичная проблема: Android: я не могу иметь ViewPager WRAP_CONTENT

Я пытаюсь реализовать интерфейс моего приложения: я хочу ListView с ViewPager в каждой строке.

Вот мои файлы:

MainActivity.java

 package com.condi; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setListAdapter(new CardListAdapter(this, getFragmentManager())); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } } 

CardListAdapter.java

 package com.condi; import java.util.List; import android.app.FragmentManager; import android.content.Context; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public class CardListAdapter extends BaseAdapter { private Context context; private FragmentManager fragmentManager; private List<Profile> profiles; CardListAdapter(Context context, FragmentManager fragmentManager) { this.context = context; this.fragmentManager = fragmentManager; this.profiles = new DatabaseHelper(context).getProfiles(); } @Override public int getCount() { return profiles.size(); } @Override public Profile getItem(int position) { return profiles.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = View.inflate(context, R.layout.profile_card, null); CardPagerAdapter mCardPagerAdapter = new CardPagerAdapter( fragmentManager); ViewPager viewPager = (ViewPager) convertView.findViewById(R.id.pager); viewPager.setAdapter(mCardPagerAdapter); viewPager.setId(R.id.pager); return convertView; } } 

Profile_card.xml (проблема возникла из wrap_content ).

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="4dp" android:background="@drawable/card_background" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </FrameLayout> 

CardPagerAdapter.java

 package com.condi; import android.app.Fragment; import android.app.FragmentManager; import android.support.v13.app.FragmentPagerAdapter; public class CardPagerAdapter extends FragmentPagerAdapter { public CardPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new Fragment1(); case 1: return new Fragment2(); } return null; } @Override public int getCount() { return 2; } } 

Fragment1.java

 package com.condi; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment1 extends Fragment { public Fragment1() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.preference_category, container, false); } } 

Fragment2.java

 package com.condi; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment2 extends Fragment { public Fragment2() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.preference_category, container, false); } } 

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

Что я делаю не так ?

Solutions Collecting From Web of "ViewPagers в ListView, показывающий элементы пустого списка"

Попробуйте изменить ViewPager в xml. wrap_content не работает.

Сделать ясно, его плохая практика использования viewpagers внутри просмотра списка, так как этот дизайн поражает производительность. Лучший способ справиться с этой проблемой:

  1. Ручная инфляция зрителей и добавление к макету.

  2. Добавьте уникальный идентификатор в каждый просмотрщик, чтобы он однозначно идентифицировался системой.

  3. Расширьте пользовательский viewpager и onmeasure (), чтобы определить макет ребенка, раздутый на выбранной странице. Вы можете сделать это, установив обратный вызов в своем настраиваемом viewpager и инициируя обратный вызов из viewpagers onPageScrolled listener, передавая позицию для определения дочернего макета.
  4. В методе onMeaure () измерьте высоту макета дочернего элемента и установите его как высоту viewpagers, используя super.onMeasure (), передающую недавно измеренные спецификации.

Ключевые моменты, чтобы отметить:

NB. Установите уникальный идентификатор для раздутого вами зрителя.

Попробуйте эту проблему в макете

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="4dp" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="4dp" android:background="@drawable/card_background" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </FrameLayout> 

Плохая практика использования wrap_content для высоты вашего viewpager. Вы можете использовать match_parent или статический dp для высоты вашего viewpager.

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dp" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="4dp" android:background="@drawable/card_background" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </FrameLayout> 

Если необходимо использовать wrap_content для высоты вашего viewpager, вы можете переопределить onMeasure onMeasure() и посмотреть высоту вашего viewpager. Ниже приведен пример ниже.

Android: я не могу иметь ViewPager WRAP_CONTENT

Надеюсь, это поможет вам.

ViewPager не поддерживает wrap_content, поскольку он стоит сейчас, потому что он не загружает всех своих детей одновременно, то есть он не может получить соответствующее измерение. Вы должны исправить высоту View в вашем xml или создать собственный ViewPager (читайте здесь ) и используйте его в своем xml

Попробуйте использовать ViewPager с фиксированной высотой внутри ListView . ViewPager не поддерживает wrap_content