ভিউপ্যাজারের বর্তমান অবস্থান প্রাপ্তি


84

আমি জানি গ্যালারী উইজেটের সাহায্যে আমি getSelectedItemPosition () ব্যবহার করতে সক্ষম হয়েছি; বর্তমান অবস্থানটি পুনরুদ্ধার করতে, তবে ভিউপ্যাজারের কাছে এটি মনে হয় না।

আমি জানি আমি একটি শ্রোতা সেটআপ করতে এবং পৃষ্ঠাটি স্যুইচ করা অবস্থায় অবস্থানটি পুনরুদ্ধার করতে পারি। তবে আমি বর্তমান দর্শনের অবস্থান চাই।

উত্তর:


94

একটি শ্রোতা তৈরি করুন এবং আপনার ভিউপাগারে সেট করুন:

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

4
এটি ব্যবহার করার সময় কেবল সচেতন থাকুন: ভিউ কখনই পরিবর্তন করা হয়নি তখন getCurrentPage () সর্বদা 0 ফিরে আসবে। কোনও কারণে যদি আপনি প্রথম ভিউ ব্যতীত অন্য ভিউতে ভিউপেজারটি প্রবেশ করেন, আপনি যে মানটি আশা করেন তা 0 হওয়া উচিত নয় ... আমি সর্বদা প্রথমটিতে ভিউটি প্রবেশ করিনি বলেই আমি এটি নিয়ে একটি ইস্যুতে দৌড়েছি some দর্শন
ব্র্যান্ডন রোমানো

4
@ অ্যাডাম আপনি কি দয়া করে আমাকে এই ফাংশনটি getCurrentPage
ইউজার 23233280

এটা খুবই সাধারণ. অ্যান্ড্রয়েডু ধন্যবাদ।
whdals0

193

তুমি ব্যবহার করতে পার:

mViewPager.getCurrentItem()

ভিউপ্যাজারে কোনও পদ্ধতি গৌনকেন্দ্রিক আইটেম নেই
দিমিত্রি গুসেলনিকভ


4
দুঃখিত আমি ভূল ছিলাম.
সবেমাত্র

4

2019 আপডেট করুন

এখন আপনি addOnPageChangeListenerপৃষ্ঠা অবস্থানে থাকা পরিবর্তন পর্যবেক্ষণ করতে ভিউ পেজারে সেট করতে পারেন ।

যেহেতু আপনি একটি শ্রোতা সেটআপ করতে এবং পৃষ্ঠাটি স্যুইচ করা অবস্থায় অবস্থানটি পুনরুদ্ধার করতে চেয়েছিলেন

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

0

আমি আপনাকে এখন এটি একটি হ্যাক বলছি, সুতরাং সেই কারণে ডাউনভোট করার কোনও কারণ নেই। অর্থ, এটি হয় বিশেষভাবে আপনার জন্য সহায়ক হবে বা নাও। যে কোনও উপায়ে, নীচের বিবরণটি কিছু অন্তর্দৃষ্টি প্রদান করবে এবং সম্প্রদায়ের জন্য সহায়ক হবে। এছাড়াও, পুরানো এপিআইগুলির কাছে এই সমাধানটি ভাল ViewPager.getCurrentItem()


প্রথম, একটি সামান্য তথ্য। যদি আপনি পুনরুক্তি সঙ্গে একটি ViewPager অন্য সব লোকরা পুরনো ViewPager.getChildAt(x);এবং প্রিন্ট আউট toString()(অথবা getLeft()) প্রতিটি শিশুর দেখুন (একটি পৃষ্ঠায়) এবং তারপর এই সব আপনি পৃষ্ঠাগুলি পরিবর্তন করেন, তখন আপনাকে লক্ষ্য করবেন যে শিশু যে তারা প্রদর্শিত হয় লজিক্যাল ক্রম হবে না আপনি যখন পৃষ্ঠাগুলি ফিরে যেতে শুরু করেন (শুরুতে পেজিং করা হয়)। স্পষ্টতই, এটি অ্যান থেকে অপ্রয়োজনীয় শিশুটিকে সরিয়ে ফেলবে এবং তারপরে অ্যারেতে নতুন শিশুটিকে যুক্ত করবে। সুতরাং, উদাহরণস্বরূপ, যাক আপনি 2 পৃষ্ঠার দিকে তাকিয়ে আছেন এবং এর পরে পৃষ্ঠা 3 এ পরিবর্তন করেছেন, আপনার বাচ্চাদের তালিকা এই ক্রমে থাকবে page 2, page 3, page 4যার অর্থ ViewPager.getChildAt(1);বর্তমান পৃষ্ঠাটি ফিরে আসবে। তবে, আপনি যদি দ্বিতীয় পৃষ্ঠায় ফিরে যান (পৃষ্ঠা 3 থেকে) আপনার বাচ্চাদের তালিকা এই ক্রমে থাকবে page 2, page 3, page 1যার অর্থ এটিViewPager.getChildAt(1);বর্তমান পৃষ্ঠাটি ফেরত দেয় না। এই তথ্যটি ব্যবহার করে আমি বর্তমান পৃষ্ঠায় আগাছা ফেলার সহজ যুক্তি খুঁজে পাইনি। কারণ পিছনে অ্যারেতে থাকা পৃষ্ঠাগুলি getChildAtক্রমটি স্বেচ্ছাসেবীর অর্ডারে থাকে ব্যবহারকারী কীভাবে চারপাশে পেজিং করে চলেছে তার ভিত্তিতে।

বলা হচ্ছে, আমি একটি হ্যাক ওয়ার্ক-ওয়ার্ড বিকাশ করেছি। এই ফাংশনটি সমস্ত পরিবেশে কাজ করবে কিনা আমার কোনও ধারণা নেই তবে এটি আমার বর্তমান প্রকল্পের জন্য কাজ করে। আমি সন্দেহ করব যদি এটি আপনার পক্ষে না হয় তবে এটি বিভিন্ন এপিআই স্তরের একটি ইস্যু। তবে আমি অন্যান্য পরিবেশের জন্য আসলে কোনও সমস্যা সন্দেহ করি না।

এখন, মাংস উপর। আমি যেটা লক্ষ্য করেছি তা হ'ল ফলাফলের ViewPager.getChildAt(x).getLeft()প্যারেন্টের সাথে কিছু ধরণের অনুভূমিক পিক্সেল স্থানাঙ্ক থাকবে। সুতরাং, আমি এই তথ্যটি আগাছা করার জন্য ব্যবহার করেছি যেটি এখনকার দর্শন।

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

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

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


4
তুমি আমাকে বাঁচালে! কিছু জঘন্য বাগ ছিল। কি ভুল হচ্ছে তা খুঁজে পেল না। আপনি, স্যার, একটি বাজিলিয়ন উর্ধ্বতন প্রাপ্য!
নুরসুলান তালাপবকভ

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