getViewTypeCount এবং অ্যারেএডাপ্টারের getItemViewType পদ্ধতি


159

কেউ কি সরল কথায় আমাকে এর ব্যবহার getViewTypeCount()এবং এর getItemViewType()পদ্ধতিগুলি ব্যাখ্যা করতে পারে ArrayAdapter?

উত্তর:


308

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

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return position % 2;
}

কাঠামোটি আপনার পদ্ধতির মাধ্যমে কোন দর্শন আপনাকে আপনাকে হস্তান্তর করবেconvertViewgetView তা সিদ্ধান্ত নিতে আপনার দর্শন প্রকারটি ব্যবহার করে । অন্য কথায়, উপরের উদাহরণে, আপনার এমনকি সারিগুলি পুনরায় ব্যবহার করতে বাম পাশের চিত্রগুলি সহ পুনর্ব্যবহারযোগ্য ভিউগুলি পাবে এবং বিজোড় সারিগুলি কেবল ডানদিকে ছবিযুক্তগুলি পাবে।

যদি আপনার তালিকার প্রতিটি সারিতে একই লেআউট থাকে তবে আপনাকে দেখার ধরণের বিষয়ে চিন্তা করার দরকার নেই। আসলে, বেসএডাপ্টার.জভা সমস্ত অ্যাডাপ্টারের জন্য একটি ডিফল্ট আচরণ সরবরাহ করে:

public int getItemViewType(int position) {
    return 0;
}

public int getViewTypeCount() {
    return 1;
}

এটি আপনাকে প্রতিটি সারির জন্য একই দর্শন প্রকার সরবরাহ করে।

সম্পাদনা করুন - সাধারণ প্রবাহের রূপরেখার জন্য:

  1. আপনি AdapterViewএকটি অ্যাডাপ্টার ব্যবহার করে আপনার সাথে ডেটা বাঁধেন।
  2. AdapterViewচেষ্টা আইটেম ব্যবহারকারীকে কাছে দৃশ্যমান প্রদর্শন।
  3. ফ্রেমওয়ার্কটি getItemViewTypeসারিটির জন্য কল করে n, এটি সারিটি প্রদর্শন করতে চলেছে।
  4. কাঠামোর সারিটির nধরণের দর্শনগুলির জন্য তার পুনর্ব্যবহারযোগ্য ভিউ পুলটি পরীক্ষা করে । এটি কোনও খুঁজে পাচ্ছে না কারণ এখনও পর্যন্ত কোনও মতামত পুনর্ব্যবহার করা হয়নি।
  5. getViewসারি জন্য বলা হয় n
  6. আপনার কী ধরণের দৃষ্টিভঙ্গি ব্যবহার করা উচিত তা নির্ধারণ করার getItemViewTypeজন্য আপনি সারিটির জন্য কল করেন n
  7. কোন ভিউ টাইপ করা প্রয়োজন তার উপর নির্ভর করে আপনি একটি ভিন্ন এক্সএমএল ফাইল স্ফীত করতে আপনি যদি একটি / স্যুইচ স্টেটমেন্ট ব্যবহার করেন।
  8. আপনি তথ্য দিয়ে ভিউ পূরণ করুন।
  9. আপনি দৃশ্যটি ফিরে আসছেন, প্রস্থান করছেন getViewএবং আপনার সারিটির দৃশ্য ব্যবহারকারীর কাছে প্রদর্শিত হবে।

এখন, যখন কোনও দৃশ্য স্ক্রোলটি স্ক্রোল করে পুনর্ব্যবহার করা হয় তখন এটি ফ্রেমওয়ার্ক দ্বারা পরিচালিত একটি পুনর্ব্যবহারযোগ্য ভিউ পুলে যায়। এগুলি মূলত ভিউ টাইপের দ্বারা সংগঠিত করা হয় যাতে convertViewআপনার getViewপদ্ধতির প্যারামিটারে সঠিক ধরণের একটি ভিউ আপনাকে দেওয়া হয় :

  1. ফ্রেমওয়ার্কটি আবার getItemViewTypeযে সারিটি প্রদর্শন করতে চায় তা কল করে।
  2. এবার উপযুক্ত ধরণের পুনর্ব্যবহারযোগ্য পুলে একটি দৃশ্য রয়েছে।
  3. পুনর্ব্যবহারযোগ্য ভিউটি convertViewআপনার getViewপদ্ধতির পরামিতি হিসাবে আপনাকে দেওয়া হবে ।
  4. আপনি নতুন তথ্য দিয়ে পুনর্ব্যবহৃত দৃশ্যটি পূরণ করুন এবং এটি ফিরিয়ে দিন return

1
@ ম্যাথিউ, আপনার উত্তরের জন্য ধন্যবাদ কীভাবে এই পদ্ধতিগুলি চাওয়া হয় আপনি প্রবাহটি বর্ণনা করতে পারেন। এছাড়াও আমি বুঝতে পারি না এটি কীভাবে পুনরায় / লেআউটে আমার ডেটার সাথে যুক্ত।
ইউজিন

এই পদ্ধতিগুলি চালিত হওয়ার জন্য কোনও স্পষ্ট চুক্তি নেই। মাঝামাঝি / লেআউট জন্য স্থান দৃশ্য বস্তু। এটি একটি অ্যাডাপ্টার । আপনার গেটভিউ পদ্ধতিতে আইটেমের ধরণটি যাচাই করা উচিত এবং সেই অনুসারে রেজ / লেআউট থেকে সঠিক দর্শনটি স্ফীত করা উচিত।
ম্যাথু উইলিস

1
আপনি এটিকে নিজেই আইটেমভিউ টাইপে ফিরিয়ে দিচ্ছেন।
ম্যাথু উইলিস

আপনি getView মধ্যে নিজে সমিতি কি যদি (টাইপ == 0) {/ * ফোলান R.layout.row_icon_on_left /} অন্য {/ ফোলান R.layout.row_icon_on_right * /}
ম্যাথু উইলিস

75
সতর্ক থাকুন! getItemViewType () অবশ্যই 0 এবং getViewTypeCount () - এর মধ্যে একটি পূর্বাবস্থায় ফিরে আসতে হবে
প্যাসিফিকস্কি

12

আমরা দৃশ্য বিভিন্ন ধরনের দেখানোর জন্য প্রয়োজন ব্যবহার তার ভাল তালিকা-ভিউ তারপর getViewTypeCount()এবং getItemViewType()একটি দৃশ্য টগল করানোর পরিবর্তে অ্যাডাপ্টারের মধ্যে View.GONEএবং View.VISIBLEখুব ব্যয়বহুল কাজের ভিতরে হতে পারে getView()যা তালিকা স্ক্রল প্রভাবিত করবে।

অ্যাডাপ্টারের getViewTypeCount()এবং ব্যবহারের জন্য দয়া করে এটি পরীক্ষা করুন getItemViewType()

লিঙ্ক: -র-ব্যবহার -র-ভিউ-ভিটিপ্যাক্ট


আইটিনভিউ টাইপ () -র আইজিএনরে_আইটিউ_ভিউ_ওয়াইপি ফিরে আসার ফলে সমস্ত ইউআই উপাদান সূচনা করতে জোর করে গেটভিউ (অন্তর্নিহিত অবস্থান, দর্শন দেখুন, ভিউগ্রুপ ভিউ গ্রুপ) নাল হিসাবে 'ভিউ' পাস হবে pass এটি কি কোনও খারাপ পারফরম্যান্স সূচক নয় যেখানে ধারক প্যাটার্নের ক্ষেত্রে আমরা বিদ্যমান ইউআই ভিউগুলিকে পুনরায় ব্যবহার করতে পারি এবং আমরা অবস্থানটি ভিত্তিতে ভিউ-জিওএন বা ভিউ -ভিজিবলতে টোগল করতে পারি।
নম্রতা বাগেরওয়াল

11

আউটটেট দেখুন !!!! গতকাল
বাস্তবায়ন করতে গিয়ে আমাকে সমস্যার মুখোমুখি হয়েছিল ListViewএবং সারিগুলির জন্য এটি দুটি ধরণের মতামতগুলি স্ক্রোল করার ঠিক পরে ঝাঁপিয়ে পড়ে। যদিও এই থ্রেডের মধ্যে শীর্ষে ভোট দেওয়া উত্তর একটি ভাল সাধারণ ব্যাখ্যা দেয় তবে এটি উল্লিখিত UI বাগটি বন্ধ করার জন্য তথ্যের সর্বাধিক গুরুত্বপূর্ণ বিষয়টিকে হাইলাইট করে না।

এখানে আমার ব্যাখ্যা হল:
উভয় getViewTypeCount()এবং getItemViewType()দ্বারা ব্যবহার করা হচ্ছে BaseAdapter'র getViewপদ্ধতি খুঁজে বের করতে একটি দৃশ্য কোন ধরনের এটি আনা হবে পুনর্ব্যবহৃত এবং ফিরে আসেন। (থ্রেডের মধ্যে শীর্ষের উত্তরে ব্যাখ্যা করা হয়েছে)। তবে যদি আপনি অ্যান্ড্রয়েড এপিআই ডক অনুসারে স্বতঃস্ফূর্তভাবে এই দুটি পদ্ধতি বাস্তবায়ন না করেন তবে আপনি যে সমস্যাটির কথা বলেছি তাতে আপনি সমস্যার মধ্যে পড়তে পারেন।

বাস্তবায়নের সংক্ষিপ্ত নির্দেশিকা:
একাধিক প্রকারের বাস্তবায়ন Viewsজন্য ListViewএর সারি আমরা মূলত বাস্তবায়ন করতে হবে, getItemViewType()এবং getViewTypeCount()পদ্ধতি। এবং getItemViewType()ডকুমেন্টেশন আমাদের নীচে একটি নোট দেয়:

নোট: পূর্ণসংখ্যার সীমার মধ্যে থাকতে হবে 0থেকে getViewTypeCount() - 1IGNORE_ITEM_VIEW_TYPEফিরে আসতে পারে।

সুতরাং আপনার মধ্যে getItemViewType()0 থেকে শুরু করে শেষ প্রকারের (প্রকারের সংখ্যা - 1) হিসাবে প্রকারের ধরণটির মানগুলি ফিরে আসা উচিত। উদাহরণস্বরূপ, আসুন বলি যে আপনার কাছে কেবল তিন ধরণের মতামত রয়েছে? সুতরাং দেখার জন্য ডেটা অবজেক্টের উপর নির্ভর করে, আপনি কেবল শূন্য-ভিত্তিক অ্যারে সূচকগুলির মতো পদ্ধতি থেকে 0 বা 1 বা 2 ফিরতে পারবেন getItemViewType()। এবং আপনার কাছে যেমন তিন ধরণের ভিউ ব্যবহৃত হয়েছে, আপনার getViewTypeCount()পদ্ধতিটি অবশ্যই 3 টি ফিরে আসবে।

যে কোনও ক্ষেত্রে আপনি যদি এই পদ্ধতির জন্য অন্য কোনও পূর্ণসংখ্যার মানগুলি 1, 2, 3 বা 111, 222, 333 হিসাবে ফেরৎ করেন তবে আপনি অবশ্যই উপরের ইউআই বাগটি অনুভব করতে পারেন যা আপনি কেবল অ্যান্ড্রয়েড এপিআই ডক না মানার দ্বারা রেখেছিলেন।

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

আরও তথ্যের জন্য অ্যান্ড্রয়েড বিকাশকারী ডক পড়ুন আপনি সম্ভবত এটির ক্লু খুঁজে পেতে পারেন।

আশা করি এই উত্তরটি কারও পক্ষে প্রচুর ঘন্টা বাঁচাতে সহায়ক হতে পারে !!!

চিয়ার্স !!!


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

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