16

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>

これは私のリストアダプターです:

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();
    }
}
4

4 に答える 4

27

ページャーを動的に追加する必要があるときはいつでも、 を使用して各ページャーの ID を設定する必要がありますViewPager.setId()

于 2013-02-25T16:09:30.797 に答える
3

サンプルアプリを作成しました

フラグメントを使用した ViewPager の例: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

しかし、大きな欠点が 1 つあります。すべてのセルはメモリに保存され、多くのセルがあるかどうかにかかわらず、アプリケーションはメモリ不足によってクラッシュする可能性があります

編集:

経験的に発見されています。使用する場合は、ViewPager で代わりにフラグメントを表示するだけです。私はアダプタを正しく書くことができ、メモリに打たれることはありません

ビューを含む ViewPager の例: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

誰かが助けてくれることを願っています

于 2014-08-09T14:27:18.503 に答える
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. 一意の ID を生成
于 2015-07-11T17:09:41.143 に答える
-3

私はまったく同じ問題に直面しました。ソリューション:

  1. 使用ホルダー
  2. タグを使用
  3. 一意の ID を生成

問題を解決しました。誰かコードが必要な場合は、私に ping してください。

于 2015-05-05T08:07:56.377 に答える