আপনার নিজস্ব কাস্টম অ্যাডাপ্টার তৈরি করার সময় getView () পদ্ধতিটি কীভাবে কাজ করে?


101

আমার প্রশ্নগুলি হ'ল:

  1. লেআউটআইনফ্লেটারের কাজটি ঠিক কী?
  2. আমি যে সমস্ত নিবন্ধগুলি পড়েছি সেগুলি কেন রূপান্তর ভিউ প্রথমটি বাতিল বা না তা যাচাই করে? এটি শূন্য হলে এর অর্থ কী এবং যখন তা নেই তখন এর অর্থ কী?
  3. এই পদ্ধতিটি প্যারেন্ট প্যারামিটারটি কী গ্রহণ করে?

উত্তর:


115

1: LayoutInflaterএটি আপনার লেআউটটি এক্সএমএল-ফাইল নেয় এবং এর সামগ্রীগুলি থেকে পৃথক ভিউ-অবজেক্ট তৈরি করে।

2: অ্যাডাপ্টারগুলি ভিউজের পুনঃব্যবহারের জন্য নির্মিত হয়, যখন কোনও ভিউ স্ক্রল করা হয় যাতে এটি আর দৃশ্যমান হয় না, এটি প্রদর্শিত হওয়া নতুন ভিউগুলির মধ্যে একটির জন্য ব্যবহার করা যেতে পারে। এই পুনঃব্যবহৃত দৃশ্যটি হ'ল convertView। যদি এটি বাতিল হয় তবে এর অর্থ হ'ল কোনও পুনর্ব্যবহারযোগ্য ভিউ নেই এবং আমাদের একটি নতুন তৈরি করতে হবে, অন্যথায় নতুন তৈরি এড়াতে আমাদের এটি ব্যবহার করা উচিত।

3: parentসরবরাহ করা হয়েছে যাতে আপনি সঠিক বিন্যাসের পরামিতিগুলির জন্য নিজের দৃষ্টিভঙ্গিটিকে স্ফীত করতে পারেন।

এই সমস্ত একসাথে কার্যকরভাবে আপনার তালিকায় প্রদর্শিত হবে এমন দৃশ্য তৈরি করতে ব্যবহার করা যেতে পারে (বা অন্যান্য দৃশ্য যা অ্যাডাপ্টার গ্রহণ করে):

public View getView(int position, @Nullable View convertView, ViewGroup parent){
    if (convertView == null) {
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    }
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.
    return convertView;
}

এর ব্যবহারটি লক্ষ্য করুন LayoutInflater, এটি এর পক্ষে parentযুক্তি হিসাবে ব্যবহার করা যেতে পারে এবং কীভাবে convertViewপুনরায় ব্যবহার করা হয়।


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

খুব বেশি পুনর্নির্মাণের দরকার নেই। কেবল আপনাকে সুইচ লিখতে হবে বা যদি-অন্য সিঁড়িটি গেটভিউতে লিখতে হয় এবং আপনার কেস অনুসারে ভিউগুলিকে উত্সাহিত করতে পারে, পাবলিক ইনট গেট আইটেমভিউটাইপ (ইনট পজিশন) এবং পাবলিক ইনট ভিউটাইপকাউন্ট () ওভাররাইড করে। @ সাগিতস
প্রশান্ত দেববাদ্বর

যদি বিবৃতিগুলি সাধারণত কাজ করে তবে রেডিও বোতামগুলি ব্যবহার করার সময়, পাঠ্য সম্পাদনা করুন এবং এই জাতীয় জিনিসগুলি ক্যাশেড ভিউগুলি ব্যবহার করে আমি সমস্যায় পড়েছিলাম, স্ট্যাক ওভারফ্লোতে এই স্টাফ সম্পর্কে কিছু প্রশ্ন রয়েছে।
মেগা 8'15

71

getView()অ্যাডাপ্টার পদ্ধতি একটি এর উৎপাদিত আইটেমের দৃশ্য জন্য ListView, Gallery...

  1. LayoutInflaterদেখুন বস্তুর যা আপনি একটি লেআউট XML- এর সংজ্ঞায়িত (রুট বস্তু, সাধারণত একটি পেতে ব্যবহার করা হয় LinearLayout, FrameLayoutঅথবা RelativeLayout)

  2. convertViewপুনর্ব্যবহারের জন্য। ধরা যাক আপনার একটি তালিকাদর্শন আছে যা একবারে কেবলমাত্র 10 টি আইটেম প্রদর্শন করতে পারে এবং বর্তমানে এটি আইটেম 1 -> আইটেম 10 প্রদর্শিত হচ্ছে 10 যখন আপনি একটি আইটেম ডাউন স্ক্রোল করবেন তখন আইটেম 1 পর্দার বাইরে চলে যাবে এবং 11 আইটেমটি প্রদর্শিত হবে । আইটেম 11-এর জন্য ভিউ তৈরি করতে, getView () পদ্ধতিটি কল করা হবে এবং convertViewএখানে আইটেম 1 -র দৃশ্য (যা এখন আর প্রয়োজনীয় নয়)। সুতরাং পরিবর্তে আইটেম 11 (যা ব্যয়বহুল) এর জন্য একটি নতুন ভিউ অবজেক্ট তৈরি করুন, কেন পুনরায় ব্যবহার করবেন না convertView? => আমরা খালি convertViewনাল বা না তা যাচাই করে নিই , যদি নূতন নতুন ভিউ তৈরি করে, অন্যথায় পুনরায় ব্যবহার করুন convertView

  3. parentViewতালিকাগুলি বা গ্যালারী ... এটিতে getView()তৈরি হওয়া আইটেমটির ভিউ রয়েছে ।

দ্রষ্টব্য : আপনি এই পদ্ধতিটি সরাসরি কল করবেন না, আইটেমের দর্শন কীভাবে উত্পন্ন করা যায় তা পিতামাত্ত দর্শনকে জানানোর জন্য এটি প্রয়োগ করা দরকার।


2
প্যারেন্ট ভিউয়ের জন্য দুর্দান্ত ব্যাখ্যা, এটির চেয়ে আরও ভাল ব্যাখ্যা খুঁজে পাওয়া যায় না, +1
আহমেদ অ্যাডেল ইসমাইল

বিস্ময়কর ব্যাখ্যা!
gabi

দুর্দান্ত ব্যাখ্যা +1
tpk

8

তালিকার ভিউ সম্পর্কে আপনার এই ভিডিওটির এক নজরে থাকতে পারে। এটি গত বছরগুলিতে গুগল আইও এবং এখনও আমার মনের তালিকার সেরা দেখার জন্য walk

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. এটি লেয়ারআলআউট এবং অন্যান্য মতামতের মতো জাভা অবজেক্টগুলিতে লেআউটগুলি (আপনার রেজ / লেআউট / ফোল্ডারের এক্সএমএল ফাইলগুলি) স্ফীত করে।

  2. ভিডিওটি দেখুন, রূপান্তর দর্শনটি কী ব্যবহার করে তা নিয়ে আপনি আপ টু ডেট পাবেন, মূলত এটি পুনর্বিবেষ্টিত একটি দৃশ্য যা আপনার দ্বারা পুনরায় ব্যবহার করার অপেক্ষায় রয়েছে, কোনও নতুন অবজেক্ট তৈরি করতে এবং আপনার তালিকার স্ক্রোলিংকে কমিয়ে না দেওয়ার জন্য।

  3. আপনাকে অ্যাডাপ্টার থেকে তালিকা-দর্শনের রেফারেন্স দেওয়ার অনুমতি দেয়।


5

লেআউটআইনফ্লেটারের কাজটি ঠিক কী?

আপনি যখন এক্সএমএল ব্যবহার করে ডিজাইন করেন, আপনার সমস্ত ইউআই উপাদানগুলি কেবল ট্যাগ এবং পরামিতি। আপনি এই ইউআই উপাদানগুলি ব্যবহার করার আগে (যেমন একটি টেক্সটভিউ বা লিনিয়ারলআউট), আপনাকে এই এক্সএমএল উপাদানগুলির সাথে সম্পর্কিত প্রকৃত অবজেক্ট তৈরি করতে হবে। এটিই স্ফীতকারীটির জন্য। ইনফ্ল্যাটার, প্রকৃত অবজেক্ট তৈরি করতে এবং সমস্ত পরামিতি সেট করতে এই ট্যাগগুলি এবং তাদের সম্পর্কিত প্যারামিটারগুলি ব্যবহার করে। এর পরে আপনি FindViewById () ব্যবহার করে ইউআই উপাদানটির একটি রেফারেন্স পেতে পারেন।

আমি যে সমস্ত নিবন্ধগুলি পড়েছি সেগুলি কেন রূপান্তর ভিউ প্রথমটি বাতিল বা না তা যাচাই করে? এটি শূন্য হলে এর অর্থ কী এবং যখন তা নেই তখন এর অর্থ কী?

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

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

এই পদ্ধতিটি প্যারেন্ট প্যারামিটারটি কী গ্রহণ করে?

পিতামাতা হ'ল ভিউগ্রুপ যা আপনার ভিউ () দ্বারা তৈরি করা অবশেষে সংযুক্ত হয়। এখন আপনার ক্ষেত্রে এটি তালিকাভিউ হবে।

আশাকরি এটা সাহায্য করবে :)


4
  1. লেআউট স্ফীতকারী আপনার বর্তমান দর্শনে বাহ্যিক এক্সএমএলকে স্ফীত করে / সংযুক্ত করে।

  2. getView () কে স্ক্রল করা সহ অসংখ্যবার বলা হয়। সুতরাং যদি এটি ইতিমধ্যে স্ফীতভাবে দেখা থাকে তবে আমরা এটি আর করতে চাই না কারণ স্ফীতকরণ একটি ব্যয়বহুল প্রক্রিয়া .. তবে কেন আমরা এটির নাল পরীক্ষা করে তা স্ফীত করে দিই।

  3. প্যারেন্ট ভিউটি আপনার তালিকার একক কক্ষ ..


3
মূল দৃষ্টিভঙ্গি এখানে ভুলভাবে ব্যাখ্যা করা হয়েছে। এটি তালিকার ভিউ হবে না তালিকার আইটেম
বরুণ জৈন

2

LayoutInflaterListViewআইটেমটির জন্য বা onCreateViewখণ্ডের মধ্যে এক্সএমএলটির গতিশীল দর্শন তৈরি করতে ব্যবহৃত হয় ।

ConvertViewমূলত সেই দর্শনগুলিকে পুনর্ব্যবহার করতে ব্যবহৃত হয় যা বর্তমানে দৃশ্যতে নেই। বলুন আপনার স্ক্রোলযোগ্য আছে ListView। নীচে বা উপরে স্ক্রোল করার convertViewসময়, স্ক্রোল করা ছিল এমন দৃশ্য দেয়। এই পুনরায় ব্যবহার স্মৃতি সংরক্ষণ করে।

getView()পদ্ধতির প্যারামেন্টের প্যারামিটারটি প্যারেন্ট লেআউটে একটি রেফারেন্স দেয় যা তালিকার ভিউ রয়েছে। বলুন যে আপনি যে আইটেমটি প্যারেন্ট এক্সএমএল ব্যবহার করতে পারেন তা পেতে চাই:

ViewParent nv = parent.getParent();

while (nv != null) {

    if (View.class.isInstance(nv)) {
        final View button = ((View) nv).findViewById(R.id.remove);
        if (button != null) {
            // FOUND IT!
            // do something, then break;
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Remove", "Remove clicked");

                    ((Button) button).setText("Hi");
                }
            });
        }
        break;
    }

 }

1

getView()পদ্ধতি নতুন তৈরি Viewবা ViewGroupপ্রতিটি সারিতে Listviewবা স্পিনার। আপনি এটি Viewবা ফোল্ডারে ViewGroupকোনও Layout XMLফাইলে সংজ্ঞায়িত করতে পারেন res/layoutএবং এটি Adapterক্লাস অবজেক্টে রেফারেন্স দিতে পারেন ।

আপনার যদি অ্যারেতে 4 টি আইটেম অ্যাডাপ্টারে যায়। getView()পদ্ধতি অ্যাডপেপারের 4 সারিগুলির জন্য 4 ভিউ তৈরি করবে।

লেআউটআইনফ্লেটার ক্লাসে একটি মেথড ফুলে () যা এক্সএমএল রিসোর্স লেআউট থেকে ভিউ অবজেক্ট তৈরি করুন।


0

আপনি অ্যাডাপ্টার.জভা ফাইলের অ্যাডাপ্টার ইন্টারফেসে getView সম্পর্কে দরকারী তথ্যও পেতে পারেন। এটা বলে;

/**
 * Get a View that displays the data at the specified position in the data set. You can either
 * create a View manually or inflate it from an XML layout file. When the View is inflated, the
 * parent View (GridView, ListView...) will apply default layout parameters unless you use
 * {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
 * to specify a root view and to prevent attachment to the root.
 * 
 * @param position The position of the item within the adapter's data set of the item whose view
 *        we want.
 * @param convertView The old view to reuse, if possible. Note: You should check that this view
 *        is non-null and of an appropriate type before using. If it is not possible to convert
 *        this view to display the correct data, this method can create a new view.
 *        Heterogeneous lists can specify their number of view types, so that this View is
 *        always of the right type (see {@link #getViewTypeCount()} and
 *        {@link #getItemViewType(int)}).
 * @param parent The parent that this view will eventually be attached to
 * @return A View corresponding to the data at the specified position.
 */
View getView(int position, View convertView, ViewGroup parent);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.