ভিউপ্যাজারের পৃষ্ঠাটি কীভাবে পরিবর্তন করবেন?


150

আমি আমার অ্যাপ্লিকেশনটিতে ভিউপেজার ব্যবহার করছি এবং এটি প্রধান ক্রিয়াকলাপে এটি সংজ্ঞায়িত করছি। onCreateপদ্ধতির অভ্যন্তরে আমি SharedPreferences থেকে কয়েকটি পৃষ্ঠা লোড করি এবং তারপরে এটি পেজারআডাপ্টারে পাস করি:

@Override
public int getCount() {
    return numberOfPages;
}

সমস্যাটি হ'ল আমি যদি এই সংখ্যাকে পছন্দসই (বা অন্য কোনও ক্রিয়াকলাপে) এর আগে পরিবর্তন করা পৃষ্ঠার সূচকে অন্য কিছুতে পরিবর্তন করতাম তবে আমার অ্যাপ্লিকেশন ক্রাশ হয়ে গেছে কারণ যখন এই ভিউপ্যাজারের সাথে ক্রিয়াকলাপে ফিরে আসি তখন এই সূচকটি সীমার বাইরে চলে যায়। সক্রিয় ভিউপ্যাজারের পৃষ্ঠা পরিবর্তন করে এটি ঠিক করা যেতে পারে। এটা করতে কোন উপায় আছে কি?

উত্তর:


394

আমি নিশ্চিত না যে আমি প্রশ্নটি পুরোপুরি বুঝতে পেরেছি, তবে আপনার প্রশ্নের শিরোনাম থেকে, আমি অনুমান করছি যে আপনি যা খুঁজছেন তা pager.setCurrentItem( num )। এটি আপনাকে প্রোগ্রামের মধ্যেই অন্য পৃষ্ঠায় অগ্রসর হতে দেয় ViewPager

আমার যদি সমস্যা না হয় তবে আরও সুনির্দিষ্ট হওয়ার জন্য আমাকে লগক্যাট থেকে স্ট্যাক ট্রেস দেখতে হবে।


3
হ্যাঁ, এটাই আমার দরকার। আমি এটি সেট 0মধ্যে onPauseপদ্ধতি এবং কোন বিপর্যস্ত হয়। ধন্যবাদ।
রোমান

1
ভিউপ্যাজারে সত্যই খুব কম ডকুমেন্টেশন রয়েছে। তার জন্য +1।
অর্ণব চক্রবর্তী

1
যদি আপনার পেজারটি পৃষ্ঠাটি লোড করার জন্য অনেক বেশি সময় নেয় তবে আপনি অফস্ক্রিনপেজ লিমিট (1) ব্যবহার করতে পারেন কারণ ডিফল্টরূপে পেজার লোড করুন বর্তমান অবস্থান থেকে +1 এবং -1 পৃষ্ঠাটি
অজয় পান্ড্যা

এটি কাজ করে না আমি খণ্ডটি ইতিমধ্যে যুক্ত করা হয়েছে বলে কেবল একটি ত্রুটি পেয়েছি।
স্বর্ণকেশী

24

ডানদিকে স্লাইড

viewPager.arrowScroll (View.FOCUS_RIGHT);

বাম দিকে স্লাইড

viewPager.arrowScroll (View.FOCUS_LEFT);


সংক্ষিপ্ত এবং পরিষ্কার!
ডাকভট্ট 21

1
আমি প্রায় বিশ্বাস করি যে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি বর্তমান আইটেমটি সেট করার চেয়ে অনেক বেশি ব্যবহারিক।
পিটার

18

আপনার কোডটি যাচাই না করে, আমি মনে করি আপনি যা বর্ণনা করছেন তা হ'ল আপনার পৃষ্ঠাগুলি সিঙ্কের বাইরে চলেছে এবং আপনার বাসি ডেটা রয়েছে।

আপনি বলছেন যে আপনি পৃষ্ঠাগুলির সংখ্যা পরিবর্তন করছেন, তারপরে ক্রাশ হচ্ছে কারণ আপনি পৃষ্ঠাগুলির পুরানো সেটটি অ্যাক্সেস করছেন। এটি আমার কাছে মনে pageAdapter.notifyDataSetChanged()হচ্ছে আপনার ডেটা পরিবর্তন করার পরে আপনি কল করছেন না ।

যখন আপনার viewPager10 পৃষ্ঠাগুলির সেটের পৃষ্ঠা 3 দেখানো হচ্ছে এবং আপনি কেবল 5 দিয়ে একটি সেটে পরিবর্তন করছেন, তখন কল করুন notifyDataSetChanged(), আপনি যা খুঁজে পাবেন তা হ'ল আপনি এখন নতুন সেটটির পৃষ্ঠা 3 দেখছেন। আপনি যদি পুরনো সেটটির 8 নম্বর পৃষ্ঠাটি দেখছিলেন, নতুন সেট স্থাপনের পরে এবং কল করার পরে notifyDataSetChanged()আপনি দেখতে পাবেন যে আপনি এখন নতুন সেটটির শেষ পৃষ্ঠাটি ক্র্যাশ না করেই দেখছেন।

আপনি যদি কেবল আপনার বর্তমান পৃষ্ঠাটি পরিবর্তন করেন তবে আপনি সম্ভবত সমস্যাটি মুখোশ করছেন।


1
নোটিফেটডেটসেট চেঞ্জড ()
Madhu527

@ রিচার্ড আপনি আমার দিনকে বাঁচান। 10000+ এর জন্যnotifyDataSetChanged()
আলী

15

অন্য পৃষ্ঠায় স্যুইচ করার জন্য, এই কোডটি দিয়ে চেষ্টা করুন:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);

1
পারফেক্ট! পোস্টডিলে পদ্ধতি ছাড়াই আমি এটি ব্যবহার করার চেষ্টা করেছি এবং এটি কার্যকর হয়নি। কেন আপনি জানেন যে এটি কেন এই পদ্ধতিতে কাজ করে? ধন্যবাদ! :)
জর্জি কোয়েমজিয়েভ

একই প্রশ্ন ... কেন এই বিলম্বের সাথে আইটেমটি পরিবর্তিত হচ্ছে এবং অন্যথায় নয়?
কল্যাণ রঘু

@ জর্জিকিজেডজিয়েভ কারণ আপনি কল করার সময় দেখা এখনও শেষ হয়নিviewPager.setCurrentItem
জোহাব আলি

3

পরিপূরক উত্তর

আমি ViewPagerঅন্যান্য শ্রেণীর পদ্ধতিগুলি থেকে রেফারেন্স পেতে প্রথমে সমস্যা হচ্ছিলাম কারণ addOnTabSelectedListenerএকটি বেনামে অভ্যন্তরীণ শ্রেণি তৈরি হয়েছিল, যার পরিবর্তে ViewPagerভেরিয়েবলটি ঘোষণার প্রয়োজন ছিল final। সমাধানটি ছিল শ্রেণীর সদস্যের পরিবর্তনশীল ব্যবহার করা এবং বেনামে অভ্যন্তরীণ শ্রেণিটি ব্যবহার না করা।

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.