পুনর্ব্যবহারযোগ্য ভিউতে দৃশ্যমান আইটেমগুলি পান


268

আমার রিসাইক্লারভিউতে বর্তমানে কোন উপাদানগুলি প্রদর্শিত হচ্ছে তা আমার জানতে হবে। তালিকার OnScrollListener.onScroll(...)ভিউগুলিতে পদ্ধতির সমতুল্য নেই । আমি এর সাথে কাজ করার চেষ্টা করেছি View.getGlobalVisibleRect(...), তবে সেই হ্যাকটি খুব কুৎসিত এবং সবসময় খুব বেশি কাজ করে না।

কেউ কোন ধারণা?

উত্তর:


578

প্রথম / শেষ দৃশ্যমান সন্তানের উপর নির্ভর করে LayoutManager। আপনি যদি ব্যবহার করছেন LinearLayoutManagerবা GridLayoutManager, আপনি ব্যবহার করতে পারেন

int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();

উদাহরণ স্বরূপ:

GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();

জন্য LinearLayoutManager, প্রথম / শেষ অ্যাডাপ্টার ক্রম উপর নির্ভর করে। বাচ্চাদের কাছ থেকে জিজ্ঞাসা করবেন না RecyclerView; LayoutManagerক্যাশিংয়ের জন্য দৃশ্যমানের চেয়ে বেশি আইটেম বিন্যাস পছন্দ করতে পারে।


10
লেআউটম্যানেজারের রেফারেন্স না দিয়ে রিসাইক্লার ভিউ অ্যাডাপ্টার থেকে এই পদ্ধতিগুলি অ্যাক্সেস করার কি কোনও সম্ভাবনা আছে?
ইওর্জি

3
@ ইয়োরগির মতো - অ্যাডাপ্টারের অভ্যন্তরে দরকারী মনে হয়। আমি আশ্চর্য হয়েছি যে যদি কোনও ব্যবহারকারী স্ক্রল করার সময় অন-স্ক্রিনটি আসলে কী থাকে সেগুলি ট্র্যাক করতে আপনি অনবিন্দভিউহোল্ডারটি ব্যবহার করে বিকাশ করতে পারেন এমন কিছু প্যাটার্ন রয়েছে কিনা।
রাউন্ডস্প্যারো হিলটিক্স

7
getItemCountfindFirstVisibleItemPositionএকই কলটিতে 1 এবং -1 ফিরে আসতে পারে।
এমবিএমসি

4
স্ট্যাগ্রার্ডলয়আউট ম্যানেজার সম্পর্কে আপনি কী পরামর্শ দিতে পারেন?
শৃঙ্গ 2323

37
এই পদ্ধতিগুলি এতটাই অবিশ্বাস্য যে এগুলি সম্পূর্ণ অকেজো। বিশেষত ডেটাসেটচেন্জড / আইটেম সরানো / রেঞ্জচেন্জ
জে কে

12

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

কীটি হ'ল লেআউট ম্যানেজার থেকে পদ্ধতিটি ভিউ পার্টালিটিভিজিবল

আপনার অ্যাডাপ্টারে, আপনি রিসাইক্লার ভিউ থেকে লেআউট ম্যানেজারটি পেতে পারেন, যা আপনি অনএচটেডটোরিসাইক্লারভিউ ইভেন্ট থেকে প্যারামিটার হিসাবে পাবেন ।


লেআউট ম্যানেজার নাল নয় এমন এই পদ্ধতিটি আপনি কোথায় কল করবেন?
6rchid

আপনাকে অ্যাডাপ্টারের অ্যাট্যাচডটোরিসাইক্লারভিউ ইভেন্টটির জন্য অপেক্ষা করতে হবে। এই ইভেন্টে আপনি প্যারামিটার হিসাবে রিসাইক্লারভিউ পান; এবং তারপরে আপনি পুনর্ব্যবহারযোগ্য থেকে লেআউটম্যানেজারটি পেতে পারেন এবং এটি একটি বিশ্বব্যাপী সংরক্ষণ করতে পারেন। যদি লেআউটম্যানেজারটি শূন্য থাকে তবে সম্ভবত এটি হতে পারে কারণ এটি ক্রিয়াকলাপ / খণ্ড / লেআউটে পুনর্ব্যবহারযোগ্য ভিউয়ের কাছে নিযুক্ত করা হয়নি; এবং সেই কার্যভারের পরে অ্যাডাপ্টার তৈরির চেষ্টা করুন।
আর্নেস্তো ভেগা

উত্স কোড অনুসারে, ভিউ পার্টালিভিউভিজিবলটি খারাপভাবে ভেঙে গেছে। যদি সম্পূর্ণরূপে দৃশ্যমান সত্য হয়, দৃশ্যটি সম্পূর্ণরূপে দৃশ্যমান হলে এটি সত্য হবে। যাইহোক, মিথ্যা হলে, এটি কেবল সেই ফলাফলটিকে অগ্রাহ্য করে যা দৃশ্যটি আংশিকভাবে দৃশ্যমান বা দৃশ্যমান না হলে সত্য প্রত্যাবর্তন করে। এমনকি ডকুমেন্টেশনটিও বোঝায় না।
মোলান্ডা


9

যাদের যুক্তি রয়েছে তাদের পুনর্ব্যবহারযোগ্য অ্যাডাপ্টারের অভ্যন্তরে প্রয়োগ করার জন্য আপনি এখনও what you wantরিসাইক্লারভিউয়ের সাথে পরামর্শ করার জন্য @ স্ক্রিনলাইজনারের সাথে মিলিত @ernesto পদ্ধতির ব্যবহার করতে পারেন । অ্যাডাপ্টারের অভ্যন্তরে আপনার এমন কিছু থাকবে:

@Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if(manager instanceof LinearLayoutManager && getItemCount() > 0) {
            LinearLayoutManager llm = (LinearLayoutManager) manager;
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }

                @Override
                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                        int visiblePosition = llm.findFirstCompletelyVisibleItemPosition();
                        if(visiblePosition > -1) {
                            View v = llm.findViewByPosition(visiblePosition);
                            //do something
                            v.setBackgroundColor(Color.parseColor("#777777"));
                        }
                }
            });
        }
    }

7

আপনি recyclerView.getChildAt()প্রতিটি দৃশ্যমান শিশুকে পেতে ব্যবহার করতে পারেন convertview.setTag(index)এবং অ্যাডাপ্টার কোডে এই ভিউটিতে কিছু ট্যাগ সেট করা আপনাকে এডাপ্টার ডেটার সাথে সম্পর্কিত করতে সহায়তা করবে।


GetChildAt () এর সাথে সমস্যাটি হ'ল উপাদানগুলির ক্রমটি 5 টি উপাদানের মধ্যে হতে পারে: 0, 5, 4, 3, 2, 1 (শিশু সংখ্যাটি বেশিরভাগ ক্ষেত্রে> = দৃশ্যমান আইটেমের গণনা)। তাই আমি getGlobalVisibleRect এর মাধ্যমে উপাদানটির ক্রম পাওয়ার চেষ্টা করেছি।
rekire

আপনার আসল প্রয়োজনটি কী, আসল ক্রমে দৃশ্যমান শিশু (পর্দার অন্তর্ভুক্ত শিশু) পান?
শ্রীজিথ বি নাইক

এখন আমি জানতে চাই কোন উপাদানটি কেন্দ্রে রয়েছে, পরে আমি সম্ভবত সীমানায় আগ্রহী।
rekire

1
আপনি কেবলমাত্র দৃশ্যমান আইটেমগুলি পেয়ে যাবেন recyclerView.getChildAt(), সাধারণত কীভাবে RecyclerViewকাজ করে তা তা। RecyclerViewবর্তমানে কেবলমাত্র কয়েকটি শিশু দৃষ্টিভঙ্গি ধরে রাখার চেষ্টা করবে যা বর্তমানে দৃশ্যমান (যেমন; পর্দার সীমার মধ্যে, GONE হিসাবে দৃশ্যমান নয়, অদৃশ্য হওয়া)) এবং ব্যবহারকারী স্ক্রোল করার সময় এই মতামতগুলিকে পুনর্ব্যক্ত করার চেষ্টা করবে।
শ্রীজিথ বি নাইক

6
দৃশ্যমান ছাইল্ড = পুনর্ব্যবহারযোগ্য ভিউ.সেটচিল্ডটি (0) দেখুন; int অবস্থানOfChild = পুনর্ব্যবহারযোগ্য ভিউ.সেটচিল্ডএডাপ্টারপজিশন (দৃশ্যমান ছাইল্ড);
কেভিন লি 18

4

Linear / Grid LayoutManagerকোন আইটেমগুলি তা যাচাই করতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করা যেতে পারেvisible

int findFirstVisibleItemPosition();
int findLastVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();

এবং আপনি যদি is item visible on screenকিছু প্রান্তিক ট্র্যাক করতে চান তবে নীচের ব্লগটি উল্লেখ করতে পারেন।

https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05


4

সংযোজন :

প্রস্তাবিত ফাংশন findLast ... অবস্থান () না না একটি ধ্বসে টুলবার সঙ্গে একটি দৃশ্যকল্প সঠিকভাবে কাজ করার সময় টুলবার সম্প্রসারিত করা হয়।

দেখে মনে হচ্ছে পুনর্ব্যবহারযোগ্য দৃশ্যের একটি নির্দিষ্ট উচ্চতা রয়েছে এবং সরঞ্জামদণ্ডটি প্রসারিত হওয়ার পরে, পুনর্ব্যবহারকারীটি আংশিকভাবে স্ক্রিনের বাইরে চলে গেছে। ফলস্বরূপ প্রস্তাবিত কার্যগুলির ফলাফল খুব বেশি। উদাহরণ: শেষ দৃশ্যমান আইটেমটি # 9 হতে বলা হয়েছে, তবে আসলে আইটেম # 7 হ'ল পর্দায় থাকা সর্বশেষটি।

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


এটি সত্য, তবে এইভাবে সঙ্কুচিত সরঞ্জামদণ্ডটি কাজ করে। আমি এক বছর আগে অ্যান্ড্রয়েড অ্যাপ্লিকেশন বিকাশ বন্ধ করে দিয়েছি, তবে আমি সেই বাস্তবটি মনে করতে পারি।

3

এটি করার জন্য StaggeredGridLayoutManager:

RecyclerView rv = findViewById(...);
StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(...);
rv.setLayoutManager(lm);

এবং দৃশ্যমান আইটেম দর্শন পেতে:

int[] viewsIds = lm.findFirstCompletelyVisibleItemPositions(null);
ViewHolder firstViewHolder = rvPlantios.findViewHolderForLayoutPosition(viewsIds[0]);
View itemView = viewHolder.itemView;

এটি খালি কিনা তা পরীক্ষা করে দেখুন Remember


"এটি খালি কিনা তা পরীক্ষা করুন" এর অর্থ কী? কিভাবে একটি পরীক্ষা করে?
tmm1

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