দীর্ঘ স্ক্রোলভিউ বিন্যাসের শীর্ষে কীভাবে স্ক্রোল করবেন?


162

আমার অ্যাপ্লিকেশনের অংশের জন্য, ব্যবহারকারীকে নামের একটি তালিকা উপস্থাপন করা হয় এবং তারা উপযুক্ত দেখায় তাদের গোষ্ঠী করতে বলা হয়।

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

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

এটি সমস্ত সুন্দরভাবে কাজ করে, যখন পৃষ্ঠাটি লোড হয় তখন পাতাগুলির মাঝামাঝি - সর্বদা আমার তালিকাগুলির শীর্ষে প্রি-স্ক্রোল থাকে। আমি যে পাঠ্য এবং বোতামগুলি তৈরি করেছি তা ব্যবহারকারীকে কী করতে হবে তা দৃশ্যমান নয়।

আমি স্ক্রিনটি ধরে নিয়ে স্ক্রোল আপ করতে পারি, এটি ঠিক কাজ করে তবে আমি ইতিমধ্যে উপরে স্ক্রোল করে পর্দাটি লোড করাতে চাই to সদ্য লোড হওয়া পৃষ্ঠার শীর্ষস্থানটি দেখতে ব্যবহারকারীর ইউপি স্ক্রোল করা উচিত নয়। তবে আমি প্রোগ্রামটিমে স্ক্রিনের শীর্ষে স্ক্রোল করার চেষ্টা করেছি সবকিছুই ব্যর্থ হয়েছে।

এখানে আমার অনক্রিট পদ্ধতি:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

"মেইনস্ক্রোলভিউ.পেজস্ক্রোল (View.FOCUS_UP) লাইনটি; সমস্যাটি It এটি কোনও ত্রুটি সৃষ্টি করে না, তবে এটি কিছুই করে বলে মনে হচ্ছে না I've ), এবং অন্য যা কিছু আমি ভাবতে পারি

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

সুতরাং দীর্ঘতর প্রশ্ন করার জন্য, আমি কীভাবে কোনও স্ক্রোলভিউয়ের মধ্যে থাকা স্ক্রিনে একগুচ্ছ ভিউ লোড করব এবং তারপরে প্রোগ্রামগতভাবে পুরো জিনিসটি পৃষ্ঠার শীর্ষে স্ক্রোল করব যাতে ব্যবহারকারী এটির সাথে যোগাযোগ করতে পারে?

ধন্যবাদ!

উত্তর:


264

চেষ্টা

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

এটি কাজ করা উচিত.


আমার জন্য কাজ করে। : ডি
মুনতাসির আণিক

1
আমি স্ক্রোলভিউ পেয়েছি # পূর্ণস্ক্রোল () বর্তমান ফোকাস পরিবর্তন। আমি এডিটেক্সট দিয়ে পরীক্ষা করেছি।
বিভ্রম

175

একই সমস্যা ছিল, সম্ভবত এক ধরণের বাগ।

এমনকি fullScroll(ScrollView.FOCUS_UP)অন্য উত্তর থেকে কার্যকর হয়নি। ডায়ালগটি দেখানোর পরে
কেবল যে জিনিসটি আমার জন্য কাজ করেছিল সেগুলি ডাকা হয়েছিল scroll_view.smoothScrollTo(0,0)


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

16
আমি স্ক্রোল_ভিউ.স্মুথস্ক্রোলটিও (0,0) থেকে সমাধান করি, যখন আমাদের কাছে সেই সময় স্ক্রোলভিউয়ের পাশের তালিকাসমূহ পূর্ণস্ক্রোল (স্ক্রোলভিউ.ফোকাস_আপ) কাজ করবে না।
কির্তিকুমার এ।

1
স্ক্রোল_ভিউ.স্মোথস্ক্রোলটো (0,0) আমার জন্য মেইনস্ক্রোলভিউ.ফুলসক্রল (স্ক্রোলভিউ.ফোকাস_আপ) এর চেয়ে ভাল কাজ করেছে; ধন্যবাদ!
মেরিঙ্কে

2
বেশিরভাগ ডিভাইসে ফুলস্ক্রোল (স্ক্রোলভিউ.ফোকাস_আউপি) কাজ করে, তবে নেক্সাস 5 এবং আমার যে পাঠ্য আকারে পাঠ্য আকার ছিল সেগুলিতে - সম্পূর্ণস্ক্রোলটি অ্যাকশনবারের নীচে সরানো হয়েছে, স্মুথস্ক্রোলটো (0,0) সমস্ত ডিভাইসগুলিতে আরও ভাল কাজ করেছে।
jt-gilkeson

এতে আরও সুবিধা রয়েছে fullScroll()যে এটি নির্বাচিত আইটেমটিকে সরানোর পরেও নির্বাচিত রাখে। সহ fullScroll(), স্ক্রোলভিউতে প্রথম আইটেমটি আমার ক্ষেত্রে প্রতিবার অনুসন্ধান করা হয়েছিল, স্ক্রোলটি উপরের দিকে সরানোর আগে নির্বাচিত আইটেমের চেয়ে আলাদা independent
GeertVc

97

আমার একই সমস্যা ছিল এবং এটি এটি ঠিক করে দিয়েছে। আশা করি এটি আপনাকে সহায়তা করবে।

listView.setFocusable(false);

3
এটি গ্রিডভিউগুলির জন্য সঠিক সমাধান। যখন আপনার একই ভিউ গ্রুপে একাধিক দেখার উপাদান থাকে, বিশেষত তালিকার শীর্ষে বা গ্রিডভিউয়ের অন্য একটি তালিকা দর্শন থাকে তখনই এটি ঘটে। যেহেতু অ্যাডাপ্টারটি ইউআই থ্রেডকে বিজ্ঞপ্তি দেয়, তাই দৃশ্যটি পুনরায় তৈরি করা হয় এবং প্রথম উপাদান পর্যন্ত স্ক্রোল করা হয়। কেবল তালিকাভিউ.সেটফোকসযোগ্য (মিথ্যা) / গ্রিডভিউ.সেটফোকসযোগ্য (মিথ্যা) কল করুন। আপনি যদি এটি এক্সএমএল ফাইল থেকে করেন তবে এটি কার্যকর হবে না।
ওমার্সেম

এই সমাধানটি আমার ক্ষেত্রেও কাজ করেছিল, নেস্টডস্ক্রোলভিউয়ের ভিতরে আমার রিসাইক্লার ভিউ ছিল তাই এটি স্বয়ংক্রিয়ভাবে স্ক্রোল করে চলেছিল। ধন্যবাদ মানুষ!
নিলেশ রাঠোর

অ্যাডাপ্টার সেট করার আগে আমাকে এটি যুক্ত করতে হয়েছিল তবে তার পরে মনোযোগের মতো কাজ করে works ধন্যবাদ
সম্প্রদায়

নিখুঁত ব্যাখ্যা !!
বোরজা ল্যাপেজ

মিগুয়েল এবং বিশেষত ওমরসেম উভয়কে ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ, বিশেষত এক্সএমএল সেট করা থাকলে এটি কীভাবে কাজ করবে না সে সম্পর্কে অংশটি আমার মাথা ব্যথা থেকে রক্ষা
পেয়েছে

53

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)এটি সূক্ষ্মভাবে কাজ করে, তবে কেবল এই লাইনের সমস্যাটি হ'ল, যখন ডেটা স্ক্রোলভিউঅবজেক্টে পপুলেশন হয়, তখনই তাৎক্ষণিক কল করা হয়। ডেটা পপুলেশন না হওয়া পর্যন্ত আপনাকে কিছু মিলিসেকেন্ডের জন্য অপেক্ষা করতে হবে। এই কোড ব্যবহার করে দেখুন:

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);

অথবা

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});

আমি একই ইস্যু নিয়ে কাজ করছিলাম যেখানে স্ক্রোলভিউটি পৃষ্ঠার নীচে স্ক্রোল করার কথা ছিল, ঠিক এটি ঠিক করে দেওয়া!
মেশিন ট্রাইব

1
"ম্যাজিক" এক্স সংখ্যাটি মিলিসেকেন্ডের জন্য অপেক্ষা করার পরিবর্তে আপনাকে অপেক্ষা করতে হবে, দেখুন অবজেক্টগুলি এমন একটি পোস্ট (রান্নেবল) পদ্ধতি প্রস্তাব করে যা আপনি ইউআইতে উইজেটটি রেন্ডার করার পরে রান্নেবল পোস্ট করে।
রায়ান

@ রায়ান: পোস্ট (চলমান) সর্বদা আমার জন্য নেক্সাস 5 (জিনমোশন)
ডিকা

পোস্ট (চলমান) কাজ নাও করতে পারে কারণ আপনি যদি প্রথমে স্ক্রোল আপ হিসাবে কাজ করেন এবং তারপরে ডেটাগুলি ভিউতে পপুলেশন হিসাবে ধাপে ধাপের পরে ডেটাগুলি আনা হয়। সুতরাং আপনি হয় পোস্টলিলেড (চলমান, ডামিমিলিস) ব্যবহার করা উচিত বা ডেটা জনবহুল প্রক্রিয়াগুলির পরে আপনার স্ক্রল.ফুলসক্রল (স্ক্রোলভিউ.ফোকাস_আপ) ব্যবহার করা উচিত।
ওগুজাহান

আপনার প্রথম সমাধান যেখানে আপনি স্থিতিশীল মিলিস দেন তা একটি খারাপ পদ্ধতির।
মালভিন্দর সিং

35

এই সমস্ত বৈধ সমাধানের প্রধান সমস্যা হ'ল আপনি যখন স্ক্রোলটি আঁকছেন না তখন আপনি স্ক্রোলটি সরিয়ে নিয়ে যাওয়ার চেষ্টা করছেন।

স্ক্রোল ভিউ স্ক্রিনে না আসা পর্যন্ত আপনাকে অপেক্ষা করতে হবে, তারপরে এগুলির কোনও সমাধান সহ এটিকে উপরে স্থানান্তর করুন। এটি পোস্টডেলের তুলনায় আরও ভাল সমাধান, কারণ আপনি বিলম্ব সম্পর্কে আপত্তি করবেন না।

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });

7
দুর্দান্ত সমাধান - onGlobalLayoutপদ্ধতি কল করার শেষে গ্লোবাল শ্রোতা অপসারণ করতে ভুলবেন নাscrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
নীলহেম

30

খুব সহজ

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

3
আমার জন্য এটি কার্যকর হয়নি (তৃতীয় লাইন), সমাধানটি ছিল: স্ক্রোল.ফুলসক্রল (দেখুন.ফোকাস_আপ); (আপনার প্রথম 2 লাইন সহ)
মেডস্কিল

@ মিডস্কিল, হাই, আপনি কি এটি আপনার এক্সএমএল ফাইলটিতে লিখেছেন? আমি মনে করি যে এটি কেবলমাত্র কাজ করে onCreate()
অজানা

@ immittedJ.Kimu xML ফাইলে আমার জন্য কাজ করে
প্যাগলিয়ান

এটি আমার পক্ষে কাজ করেছে। আপনার দ্বিতীয় এবং তৃতীয় উভয় লাইনের প্রয়োজন। এটি আমার জন্য এক্সএমএলে কাজ করবে না।
ইটি

2
আমি পারলে তোমাকে চুমু দিতাম! এই উপর 1-2 ঘন্টা ব্যয়। দুটি তালিকা দেখার জন্য লোড হওয়ার জন্য অপেক্ষা করা যখন সবচেয়ে ভাল এবং সেগুলিতে ফোকাস চায় না। এটির রিসুম () এ যুক্ত হয়েছে।
জন টি

24

আমি একই সমস্যার মুখোমুখি হয়েছি যখন আমি ভিউ ফিলিপার বা ডায়ালগের ভিতরে স্ক্রোলভিউ ব্যবহার করি তখন কেসটি scrollViewObject.fullScroll(ScrollView.FOCUS_UP)মিথ্যা বলে প্রত্যাশায় যাতে মামলাটি scrollViewObject.smoothScrollTo(0, 0)আমার পক্ষে কাজ করা হয়

উপরে স্ক্রোল ফোকাস



9
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}


6

এটি স্ক্রোলভিউয়ের জন্য জোর করে স্ক্রোল :

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });

4
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});

1

আমি আমার সমস্যাটি এইভাবে কোটলিনে স্থির করেছি:

scrollview.isFocusableInTouchMode = true
scrollview.fullScroll(View.FOCUS_UP)
scrollview.smoothScrollTo(0,0)

0
@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver) 
                    throws InterruptedException {
       Dimension dimensions = driver.manage().window().getSize();
        Double screenHeightStart = dimensions.getHeight() * 0.30;
        int scrollStart = screenHeightStart.intValue();
        System.out.println("s="+scrollStart);
        Double screenHeightEnd = dimensions.getHeight()*0.90;
        int scrollEnd = screenHeightEnd.intValue();
        driver.swipe(0,scrollStart,0,scrollEnd,2000);
        CommonUtils.threadWait(driver, 3000);
    }

এটি নিশ্চিতভাবে চলবে,
অজিৎ গৌর

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