将ViewPager作为ListView中的行放置

我尝试使用ViewPager作为ListView中的一行但是得到一个奇怪的行为 – 只有第一行有效,但是当我滚动列表时它会消失。 当我滚动一个空行时,突然看到上面的行。 似乎Android创建了一个单一的寻呼机并将其用于所有行。

这是我在启动应用程序时看到的内容:

屏幕截图

这是我的行布局:

       

这是我的List适配器:

 public class MyFriendsAdapter extends BaseAdapter implements OnClickListener { private ArrayList mItems; private Context mContext; private FragmentManager mFragmentManager; public MyFriendsAdapter(Context context, ArrayList items, FragmentManager fragmentManager) { mContext = context; mItems = items; mFragmentManager = fragmentManager; } @Override public int getCount() { return mItems.size(); } @Override public Object getItem(int position) { return mItems.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View currentView, ViewGroup viewGroup) { Holder holder = null; if (currentView == null) { currentView = View.inflate(mContext, R.layout.view_list_item_myfriends, null); holder = new Holder(); holder.textViewUserName = (TextView) currentView.findViewById(R.id.textViewFriendName); holder.mMyFriendspager = (ViewPager) currentView.findViewById(R.id.pagerMyFriendHabits); currentView.setTag(holder); } else { holder = (Holder) currentView.getTag(); } holder.textViewUserName.setText(mItems.get(position).getmName()); MyFriendPagerAdapter tempMyFriendPagerAdapter = new MyFriendPagerAdapter(mFragmentManager, mItems.get(position).getFriendHabits()); holder.mMyFriendspager.setAdapter(tempMyFriendPagerAdapter); return currentView; } class Holder { TextView textViewUserName; ViewPager mMyFriendspager; } } 

这是我的寻呼机适配器:

 public class MyFriendPagerAdapter extends FragmentPagerAdapter { private ArrayList mHabits; public MyFriendPagerAdapter(FragmentManager fm, ArrayList habits) { super(fm); mHabits = habits; } @Override public Fragment getItem(int index) { return new FragmentMyFriendPage(mHabits.get(index)); } @Override public int getCount() { return mHabits.size(); } } 

Solutions Collecting From Web of "将ViewPager作为ListView中的行放置"

无论何时需要动态添加寻呼机,都需要使用ViewPager.setId()为每个寻呼机设置ID。

我创建了示例应用

示例ViewPager与片段: https ://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

但是有一个很大的缺点。 所有单元都存储在内存中,无论你有多少单元,应用程序都会因内存不足而崩溃

编辑:

根据经验,它已被发现。 如果在ViewPager中使用简单视图而不是片段。 我可以正确编写适配器,而不是被内存击中

示例ViewPager与视图: https ://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

我希望有人能帮帮忙

  ///  /// To Improve ListView Memory Optimization ///  public class ViewPageHolder : Java.Lang.Object { public TextView _firstTextView{ get; set; } public ViewPager _ViewPager { get; set; } public CirclePageIndicator _CirclePageIndicator { get; set; } } Queue _pagerId= new Queue(Enumerable.Range(10, 100));//To set a Unique Id to View Pager to avoid ListView Recycle memory issue public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent) { View view = convertView; ViewPageHolder ViewPageHolder = null; if (view != null) { ViewPageHolder = view.Tag as ViewPageHolder ; } if (ViewPageHolder == null) { ViewPageHolder = new ViewPageHolder (); view = Context.LayoutInflater.Inflate(Resource.Layout.SystemListLayout, null); ViewPageHolder .SystemNameTextView = view.FindViewById(Resource.Id.SystemNameTextView); //View Pager ViewPageHolder._ViewPager = view.FindViewById(Resource.Id.viewPager); //Circle Pager Indicator ViewPageHolder.CirclePageIndicator = view.FindViewById(Resource.Id.viewPageIndicator); ViewPageHolder._ViewPager.Id = _pagerId.Dequeue(); ViewPageHolder._ViewPager.Adapter = new ZoneRenameViewPagerFragmentAdapter(fm, Context, List.ElementAt(position).Zones.ToList(), ((BaseActivity)Context).IsTablet); ViewPageHolder.CirclePageIndicator.SetViewPager(ZoneRenameHolder.ZoneRenameViewPager); view.Tag = ZoneRenameHolder; } return view; } 
  1. 使用持有人
  2. 使用标签
  3. 生成唯一ID

我遇到了完全相同的问题。 解决方案:

  1. 使用持有人
  2. 使用标签
  3. 生成唯一ID

我解决了这个问题。 如果有人需要代码请ping我。