16

我嘗試使用ViewPager作爲一個行插入ListView,但得到一個奇怪的行爲 - 只有第一行工作,但當我滾動列表它消失。當我滾動空行時,突然看到上面的行。 看起來像Android創建一個單一的尋呼機,並將其用於所有行。在ListView中放置ViewPager作爲一行

這是我所看到的,當我啓動應用程序:

screen shot

這是我行佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" 
    android:orientation="vertical" 
    android:paddingBottom="2dp" > 

    <TextView 
     android:id="@+id/textViewFriendName" 
     style="@style/TextStyle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/myFriendsBg" 
     android:paddingBottom="5dp" 
     android:paddingTop="5dp" 
     android:text="TextView" /> 

    <View style="@style/DividerHorizontalStyle_gray" /> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/pagerMyFriendHabits" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/DefaultImageHeight" /> 


    <View style="@style/DividerHorizontalStyle" /> 

</LinearLayout> 

這是我的名單適配器:

public class MyFriendsAdapter extends BaseAdapter implements OnClickListener { 

    private ArrayList<UiD_UserFriend> mItems; 
    private Context mContext; 
    private FragmentManager mFragmentManager; 

    public MyFriendsAdapter(Context context, ArrayList<UiD_UserFriend> 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<UiD_Habit> mHabits; 

    public MyFriendPagerAdapter(FragmentManager fm, ArrayList<UiD_Habit> habits) { 
     super(fm); 
     mHabits = habits; 
    } 

    @Override 
    public Fragment getItem(int index) { 
     return new FragmentMyFriendPage(mHabits.get(index)); 
    } 

    @Override 
    public int getCount() { 
     return mHabits.size(); 
    } 
} 
+0

嘿u能共享的完整代碼此實現。 thnx – 2014-11-25 12:06:25

+0

您是如何解決問題的,我在回收視圖 – Dory 2015-05-29 10:18:24

回答

27

無論何時需要動態添加尋呼機,都需要使用ViewPager.setId()爲每個尋呼機設置一個ID。

+1

中面臨同樣的問題強制實施唯一ID的一個好方法是在xml文件中將它們聲明爲整數或其他資源,然後用提供程序將其包裝在Java中。 – greg7gkb 2013-04-04 02:54:31

+1

Liren Peretz:viewPager的setId()在哪裏?我做同樣的事情,並有同樣的問題。 – 2013-06-17 10:54:05

+1

在創建尋呼機的地方,問題是您創建了一個動態查看尋呼機並且他們沒有一個id。關於prev評論的 – 2013-06-19 12:46:42

3

我創建樣品應用

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

但有一個很大的缺點。所有的細胞都存儲在內存中,應用程序可以通過低內存崩潰,不管你有很多細胞

編輯:

經驗上已經發現。如果在ViewPager中使用簡單的視圖而不是片段。我可以正確而不是寫一個適配器,內存

例ViewPager與視圖來襲:https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

我希望有人能幫助

+0

真棒例子thanx ..你可以幫助這裏嗎? http://stackoverflow.com/questions/27200546/mediaplayer-inside-viewpager-fragment – 2014-11-29 08:53:40

+0

謝謝!它幫助了很多!我投了你所有的答案。 – Zikkoua 2016-03-29 17:24:07

-3

我正好面臨同樣的問題。 解決方案:

  1. 使用持有人
  2. 使用標籤
  3. 生成唯一的編號

我解決了這個問題。 如果有人需要密碼請ping我。

+0

可以請指導如何解決一些示例代碼。 – Dory 2015-05-29 09:53:58

+0

請告訴我們你是如何做到的? – 2015-06-29 09:36:30

+0

添加了源代碼。 Dory和Dr.AndRO請參考答案。 – 2015-07-11 17:11:06

0
/// <summary> 
    /// To Improve ListView Memory Optimization 
    /// </summary> 
    public class ViewPageHolder : Java.Lang.Object 
    { 
     public TextView _firstTextView{ get; set; } 
     public ViewPager _ViewPager { get; set; } 
     public CirclePageIndicator _CirclePageIndicator { get; set; } 
    } 
Queue<int> _pagerId= new Queue<int>(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<TextView>(Resource.Id.SystemNameTextView); 
      //View Pager 
      ViewPageHolder._ViewPager = view.FindViewById<ViewPager>(Resource.Id.viewPager); 
      //Circle Pager Indicator 
      ViewPageHolder.CirclePageIndicator = view.FindViewById<CirclePageIndicator>(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. 生成唯一的編號
相關問題