16

में एक पंक्ति के रूप में ViewPager को रखने के लिए मैं ViewPager को पंक्ति सूची सूची के रूप में उपयोग करने का प्रयास करता हूं लेकिन एक विचित्र व्यवहार प्राप्त करता हूं - केवल पहली पंक्ति कार्य करता है, लेकिन जब मैं सूची स्क्रॉल करता हूं तो यह गायब हो जाता है। जब मैं एक खाली पंक्ति स्क्रॉल करता हूं, अचानक ऊपर की पंक्ति देखी जा रही है। ऐसा लगता है जैसे एंड्रॉइड एक पेजर बनाता है और सभी पंक्तियों के लिए इसका उपयोग करता है।ListView

यह मैं क्या देख जब मैं एप्लिकेशन लॉन्च है:

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; 
    } 
} 

:

<?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> 

यह मेरी सूची एडाप्टर है:

screen shot

यह मेरा पंक्ति लेआउट है यह मेरा पेजर एडाप्टर है:

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

हे यू इस कार्यान्वयन के लिए पूर्ण कोड साझा कर सकते हैं। thnx –

+0

आपने समस्या को हल कैसे किया है, मुझे रीसाइक्लर-व्यू – Dory

उत्तर

27

जब भी आपको गतिशील रूप से पेजर्स जोड़ने की आवश्यकता होती है, तो आपको ViewPager.setId() का उपयोग करके प्रत्येक पेजर के लिए एक आईडी सेट करने की आवश्यकता होती है।

+1

में एक ही समस्या का सामना करना पड़ रहा है अद्वितीय आईडी को लागू करने का एक अच्छा तरीका उन्हें एक XML फ़ाइल में पूर्णांक या अन्य संसाधनों के रूप में घोषित करना है, और फिर उसे जावा में प्रदाता के साथ लपेटना है। – greg7gkb

+1

लिरेन पेरेज़: व्यूअर के लिए आईडी() सेट करने के लिए कहां? मैं वही काम कर रहा हूं और एक ही समस्या है। –

+1

जहां आप पेजर्स बनाते हैं, समस्या यह है कि आप गतिशील रूप से पेजर्स देखते हैं और उनके पास कोई आईडी नहीं है। –

3

मैं नमूना एप्लिकेशन

उदाहरण ViewPager टुकड़ा के साथ बनाया: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager.zip

लेकिन वहाँ एक बड़ी खामी है। सभी कोशिकाओं स्मृति में जमा हो जाती है, और आवेदन, कम स्मृति द्वारा कुचल सकता है कि क्या आप कोशिकाओं

का एक बहुत

संपादित है:

अनुभव से यह पाया गया है। यदि व्यूपेजर में इसके बजाय बस खंड का उपयोग करें। मैं एक एडाप्टर सही ढंग से और नहीं लिख सकते हैं स्मृति

उदाहरण ViewPager को देखने के साथ साथ मारा जा: https://dl.dropboxusercontent.com/u/20178650/builds/listviewwithviewpager_v2.zip

मुझे आशा है कि किसी की मदद कर सकते हैं

+0

भयानक उदाहरण thanx..क्या आप यहां भी मदद कर सकते हैं? http://stackoverflow.com/questions/27200546/mediaplayer-inside-viewpager-fragment –

+0

धन्यवाद! यह बहुत मदद करता है !! मैंने आपके सभी उत्तरों के लिए मतदान किया। – Zikkoua

-3

मैं ठीक उसी मुद्दे का सामना करना पड़ा। समाधान:

  1. उपयोग धारक
  2. उपयोग टैग
  3. अनन्य Id

उत्पन्न मैं इस मुद्दे को हल किया। अगर किसी को कोड की आवश्यकता है तो कृपया मुझे पिंग करें।

+0

क्या आप कृपया मार्गदर्शन कर सकते हैं कि यह कुछ नमूना कोड के साथ कैसे हल किया गया था। – Dory

+0

कृपया हमें दिखाएं कि आपने यह कैसे किया? –

+0

जोड़ा गया स्रोत कोड। डॉरी और डॉ। एनडीआरओ कृपया उत्तर देखें। –

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