Просмотр пейджера в виде списка

У меня есть представление списка с 20 строками, и я хочу настроить пейджер представления как каждую строку в виде списка. Поскольку элементы, входящие в мою строку списка, могут иметь один или несколько, и я хочу показать элементы строки списка с помощью пейджера представления.

Для этого я использую следующий код:

Пользовательский макет, который должен отображаться в строке списка (как элемент пейджера)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/inner_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="6.0dip" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center_vertical" android:text="Example Value" android:textAppearance="?android:textAppearanceMedium" /> 

Основной список Просмотр пользовательского элемента строки с просмотром пейджера

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <android.support.v4.view.ViewPager android:id="@+id/mypager" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 

Класс MyPagerAdapter

 public class MyPagerAdapter extends PagerAdapter { private Context context; public MyPagerAdapter(Context context) { this.context = context; } @Override public int getCount() { return 4; } @Override public Object instantiateItem(View container, int position) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout view = inflater.inflate(R.layout.inner_layout_file, null); ((ViewPager) container).addView(view, position); return view; } @Override public boolean isViewFromObject(View view, Object obj) { return view == ((View) obj); } @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub ((ViewPager) container).removeView((View) object); } } 

Просмотр списка Адаптер GET VIEW METHOD

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); MyPagerAdapter adapter = new MyPagerAdapter(context); ViewPager myPager = (ViewPager) convertView.findViewById(R.id.mypager); myPager.setAdapter(adapter); myPager.setCurrentItem(0); return convertView; } 

Я не получаю ошибки, и представление, которое отображается после запуска, всегда пуст.

    Я столкнулся с одной и той же проблемой и разрешил ее, указав id на просмотрщик динамически в getView() .

     @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); MyPagerAdapter adapter = new MyPagerAdapter(context); ViewPager myPager = (ViewPager) convertView.findViewById(R.id.mypager); **myPager.setId(position + getCount());** myPager.setAdapter(adapter); myPager.setCurrentItem(0); return convertView; } 

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

    Я столкнулся с такой же проблемой. Просто дайте высоту обоим посетителям и, если необходимо, ваш основной контейнер макета списка.

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="40dip" android:orientation="horizontal" > <android.support.v4.view.ViewPager android:id="@+id/mypager" android:layout_width="match_parent" android:layout_height="40dip" /> </RelativeLayout> 

    Высота должна быть задана значением fix. Если вы хотите сделать его динамическим, вы можете попробовать установить его в кодировке во время выполнения.

    Я создал пример приложения

    Пример ViewPager с фрагментом : https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

    НО есть один большой недостаток. Все ячейки хранятся в памяти, и приложение может аварийно завершить работу с низкой памятью, есть ли у вас много ячеек

    РЕДАКТИРОВАТЬ:

    Эмпирически это было найдено. Если использовать просто просмотр фрагмента в ViewPager . Я могу правильно написать адаптер и не поражать память

    Пример ViewPager с представлением: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

    Я надеюсь, что кто-то может помочь

    Измените строку в instantiateItem ():

     ((ViewPager) container).addView(view, position); 

    чтобы:

     ((ViewPager) container).addView(view, 0); 
     @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.listview_row, parent, false); CustomeListModel customeListModel = arrayList.get(position); Utils.d("debug", "in get view method "); MyPagerAdapter adapter = new MyPagerAdapter(context, customeListModel); viewHolder=new ViewHolder(); viewHolder.viewPager= (ViewPager) convertView.findViewById(R.id.mypager); viewHolder.viewPager.setId(position + getCount()); viewHolder.viewPager.setAdapter(adapter); viewHolder.viewPager.setMinimumWidth(100); viewHolder.viewPager.setCurrentItem(1); viewHolder.viewPager.setPageMargin(-380); convertView.setTag(viewHolder); return convertView; }