তালিকাগুলি তালিকা আপডেট করার পরে তালিকার শেষে স্ক্রোল করুন


292

আমি নিশ্চিত করতে চাই যে তালিকাটি সমস্তদিকে নীচে স্ক্রল করা আছে, আমি তালিকার অ্যাডাপ্টার ব্যবহার করে তালিকার ভিউ আপডেট করার পরে, যাতে এটি তালিকায় প্রবেশ করা শেষ উপাদানটি প্রদর্শন করে। কিভাবে আমি এটি করতে পারব ?

আমি চেষ্টা করেছিলাম কিন্তু ভাগ্য নেই:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

ধন্যবাদ


এটি কাজ করে দেখুন চেষ্টা করুন ... messagesListView.setStackFromBottom (সত্য);
সুপারদেব

lv.setTranscriptMode (listView.TRANSCRIPT_MODE_ALWAYS_SCROLL) কেবল নিশ্চিত করে যে তালিকার ভিউ অ্যাডাপ্টার কল করার পরে নিচে স্ক্রোল করা হবে not যদি এটি কাজ না করে থাকে তবে এই সম্পত্তিটি এক্সএমএল হিসাবে সংজ্ঞায়িত করার চেষ্টা করুন আপনি নীচের পোস্টগুলিতে দেখতে পারেন।
টমম

উত্তর:


418

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

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@ ভূপেন্দ্র যা প্রয়োজনীয় নয়। ওয়ার্টিংয়ের উত্তরে দেখানো হয়েছে যে আপনি থ্রেড ছাড়াও করতে পারেন।
সাগরপাটিদার

2
@ ভূপেন্দ্র সেটলেশন () ইউআই আপডেট করে। ভিউতে পোস্টকে (রান্নেবল) কল করে, আপনি রান্নেবল কোডটি অ্যান্ড্রয়েড ইউআই থ্রেডে চালিত হওয়া নিশ্চিত করেছেন। আপনি ইতিমধ্যে ইউআই থ্রেডে রয়েছেন বা অন্য কোনও উপায়ে তা নিশ্চিত না করে অবধি সাধারণভাবে এটি করুন।
মেসন লি

5
এটিও মনে হয় যে একটি নতুন সেট অ্যাডাপ্টারে পোস্ট ব্যবহার করা মূল থ্রেডে থাকা নিশ্চিত করে এবং সেটপ্লেক্সেশনটি ব্যবহার করে অ্যাডাপ্টারের সাথে সাথে সেট করার পরে তাত্ক্ষণিকভাবে কোনও স্ক্রোল অ্যানিমেশনের কারণ নেই
Gianluca P.

1
কেভিনের উত্তরে ম্যাসন লি মন্তব্য করেছেন @ সাইফহামেদ, এর ফলে সংক্ষিপ্ত তালিকাটি নীচের অংশের পরিবর্তে দৃশ্যটির শীর্ষে "ফাঁকা" স্থান তৈরি করতে পারে যা সম্ভবত উদ্দেশ্যমূলক আচরণ নয়।
দশুন্ড

16
আপনি মাইলিস্টভিউ.স্মোথস্ক্রোলটোপজিশন (মাইলিস্টএডাপ্টার.জেটকাউন্ট () - 1 )ও ব্যবহার করতে পারেন; মসৃণ স্ক্রোলিংয়ের জন্য
জার ই আহমের

238

আপনার তালিকা ভিউতে আপনাকে এই পরামিতিগুলি ব্যবহার করতে হবে:

  • স্ক্রোল lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • নীচে তালিকার শীর্ষটি সেট করুন lv.setStackFromBottom(true);

আপনি এক্সএমএলে এই পরামিতিগুলি সেট করতে পারেন, যেমন। এটার মত:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
মনে রাখবেন যে এই পদ্ধতির সাথে সারিগুলি যুক্ত হওয়ার সাথে সাথে ভিউয়ের "নীচ থেকে স্ট্যাক করুন"। এর অর্থ হ'ল সংক্ষিপ্ত তালিকাগুলির নীচের অংশের পরিবর্তে ভিউয়ের শীর্ষে "খালি" স্থান থাকবে, যা সর্বদা যা চায় তা নয়।
ম্যাসন লি

2
দ্রুত প্রশ্ন: যেভাবেই আমি অ্যানিমেটেড হয়ে স্ক্রোলিংটি পেতে পারি? আমি যখন ডেটাসেটচ্যাঞ্জড () এর বিজ্ঞপ্তি দেই তখন যখন কারণটি জানায় এটি কোনও অ্যানিমেশন দিয়ে ঝাঁপ দেয়?!?!?
জর্জি

@ জর্জি আপনি সম্ভবত আপনার ডিভাইসে বিকাশকারী বিকল্পগুলিতে অ্যানিমেশনগুলি অক্ষম করেছেন?
জোনাসসিজে - মনিকা

35

TRANSCRIPT_MODE_ALWAYS_SCROLL এবং সেটস্লেੈਕਸ਼ਨ এর সংমিশ্রণটি এটি আমার পক্ষে কাজ করে

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

আমি একটি বোতাম ক্লিকের প্রতিক্রিয়া হিসাবে এটি ব্যবহার করে সাফল্য পেয়েছি, তাই আমি অনুমান করি যে আপনি আপনার সামগ্রীগুলি আপডেট করার পরেও এটি ব্যবহার করতে পারেন:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
এটি একটি দুর্দান্ত সমাধান। সরল, এক লাইন
জোশ লারসন

12

এটি একটি তালিকাফ্র্যাগমেন্টে পেতে:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

এই উত্তরটি যুক্ত করা হয়েছে কারণ যদি কেউ লিস্টফ্র্যাগমেন্টের সাথে একই সমস্যার জন্য কোনও গুগল অনুসন্ধান করে তবে সে কেবল এটি খুঁজে পেয়েছে ..

শুভেচ্ছা সহ


9

ব্যবহার: তালিকার শীর্ষটিকে নীচে সেট করুন lv.setStackFromBottom(true);

আমার জন্য কাজ করেছে এবং তালিকাটি প্রথমে দৃশ্যমানতায় আনার পরে তালিকাটি স্বয়ংক্রিয়ভাবে নীচে স্ক্রোল হবে। তালিকাটি এর পরে যেমন হওয়া উচিত তেমন স্ক্রোল করে TRANSCRIPT_MODE_ALWAYS_SCROLL


6
মনে রাখবেন যে এই পদ্ধতির সাথে সারিগুলি যুক্ত হওয়ার সাথে সাথে ভিউয়ের "নীচ থেকে স্ট্যাক করুন"। এর অর্থ হ'ল সংক্ষিপ্ত তালিকাগুলি নীচের পরিবর্তে দৃশ্যের শীর্ষে "খালি" স্থান থাকবে।
ম্যাসন লি

5

আমি ব্যবহার করি

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

নীচে এন্ট্রি যুক্ত করতে এবং পুরানো এন্ট্রিগুলি চ্যাট ট্রান্সক্রিপ্টের মতো শীর্ষে স্ক্রোল করে


getListView().smoothScrollToPosition(getListAdapter.getCount() - 1);ক্রিয়াকলাপের সূচনালগ্নে নীচে স্ক্রোল করার জন্য অনস্টার্টকে কল করুন ।
palindrom

4

সহজ সমাধানটি হ'ল:

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

ট্রান্সক্রিপ্ট মোডটি আপনি যা চান তা গুগল টক এবং এসএমএস / এমএমএস অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হয়। আপনি আইটেমগুলি যুক্ত করার পরে আপনি কি আপনার অ্যাডাপ্টারে সঠিকভাবে notifyDatasetChanged () কল করছেন?


হ্যাঁ আমি. তালিকাটি সঠিকভাবে আপডেট হয় তবে সর্বদা উপরে থেকে শুরু হয়। আমার কেবল নতুন আইটেমটি যুক্ত করা এবং সর্বদা তালিকার শেষে স্ক্রোল করা দরকার।
jramirez

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