[英]Placing ViewPager as a row in ListView
我嘗試使用ViewPager作為ListView的行,但是得到一個奇怪的行為 - 只有第一行有效,但是當我滾動列表時它會消失。 當我滾動一個空行時,突然看到上面的行。 似乎Android創建了一個單一的尋呼機並將其用於所有行。
這是我在啟動應用程序時看到的內容:
這是我的行布局:
<?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>
這是我的List適配器:
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();
}
}
每當您需要動態添加尋呼機時,您需要使用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
我希望有人能幫幫忙
/// <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;
}
我遇到了完全相同的問題。 解決方案:
我解決了這個問題。 如果有人需要代碼請ping我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.