অ্যান্ড্রয়েড ক্লাস বেসএডাপ্টারে getItem এবং getItemId পদ্ধতিগুলির উদ্দেশ্য কী?


155

পদ্ধতিগুলির উদ্দেশ্য getItemএবং getItemIdঅ্যান্ড্রয়েড এসডিকে ক্লাস অ্যাডাপ্টারে আমি আগ্রহী ।

বিবরণ থেকে, মনে হচ্ছে getItemঅন্তর্নিহিত ডেটা ফেরত আসা উচিত। সুতরাং, যদি আমার নামের একটি অ্যারে থাকে ["cat","dog","red"]এবং আমি aএটি ব্যবহার করে একটি অ্যাডাপ্টার তৈরি করি, তবে a.getItem(1)"কুকুর" ফিরিয়ে দেওয়া উচিত, সঠিক? কি a.getItemId(1)ফিরতে হবে?

আপনি যদি বাস্তবে এই পদ্ধতিগুলি ব্যবহার করেন তবে আপনি একটি উদাহরণ দিতে পারেন?


16
+1 দুর্দান্ত প্রশ্ন। আমি যে বাতলান চান getItemId()মধ্যে ArrayAdapter()সবসময় ফেরৎ -1দিয়েassert false : "TODO"; return -1;
RDS

উত্তর:


86

আমি এই পদ্ধতিগুলিকে আমার তালিকার ডেটা অ্যাক্সেসের ক্লিনার পদ্ধতির হিসাবে দেখতে পাচ্ছি। এর পরিবর্তে সরাসরি কিছু মাধ্যমে আমার অ্যাডাপ্টারের বস্তুর অ্যাক্সেস myListData.get(position)আমি কেবল মত অ্যাডাপ্টারের কল করতে পারেন adapter.get(position)

একই জন্য যায় getItemId। সাধারণত আমি যখন এই তালিকার কোনও অবজেক্টের অনন্য আইডির ভিত্তিতে কোনও কাজ সম্পাদন করতে চাই তখন আমি এই পদ্ধতিটি ব্যবহার করব would এটি একটি ডাটাবেসের সাথে কাজ করার সময় বিশেষভাবে কার্যকর। ফিরে idআসা ডাটাবেসের কোনও অবজেক্টের রেফারেন্স হতে পারে যা আমি তারপরে (আপডেট / ডিলিট / ইত্যাদি) বিভিন্ন অপারেশন করতে পারি।

সুতরাং আইডি অ্যাক্সেসের পরিবর্তে কাঁচা ডেটা অবজেক্ট থেকে myListData.get(position).getId()আপনি ব্যবহার করতে পারেন adapter.getItemId(position)

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

উদাহরণস্বরূপ, যদি আপনি আপনার তালিকা (ফল এবং মিছরি) 2 বিভাগে ছিল: যদি আপনি ব্যবহার getItem(position)এবং positionএ একটি আইটেম উপর হতে ঘটেছে ফল অধ্যায় চেয়ে যদি আপনার অনুরোধ করা, একটি ভিন্ন বস্তু পাবে getItem(position)সঙ্গে positionএ একটি আইটেম নির্দেশিত মিছরি অধ্যায়. এরপরে আপনি কোনও ধরণের ধ্রুবক আইডি মানটি ফিরিয়ে দিতে পারেন যাতে কোন ধরণের getItemId(position)ডেটা getItem(position)প্রত্যাবর্তন হয় তা উপস্থাপন করে বা instanceofআপনার কী জিনিসটি নির্ধারণ করতে ব্যবহার করে।

আমি যা উল্লেখ করেছি তা বাদ দিয়ে আমি কখনই অনুভব করতে পারি নি যে এই পদ্ধতিগুলি ব্যবহার করার দরকার ছিল আমার


7
নন-স্কোর সম্পর্কিত অ্যাডাপ্টারের জন্য, আইটেম আইডির কি এখনও একটি উদ্দেশ্য থাকবে? যদি তা হয় তবে কী ফিরিয়ে দেওয়া উচিত? অবস্থান?
অ্যান্ড্রয়েড বিকাশকারী

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

1
হ্যাঁ আমি ধারনা করেছি. getView, getCount, getViewTypeCount, ইত্যাদি সঠিকভাবে আপনার listview UI 'তে দেখানোর জন্য বিশেষভাবে ব্যবহার করা হয়। অন্যান্য কার্যাবলী কেবল সাহায্যের যেমন একটি আইটেম, ইত্যাদি ক্লিক যদিও আমি প্রায়ই ব্যবহার উপর আরও ক্রিয়া করা হিসাবে অন্যান্য বৈশিষ্ট্য বাস্তবায়ন তৈরি getItemভিতরেgetView
জেমস

1
@ নিকোলাসজোজল শিওর- এটি কার্যকর করা নিরাপদ getItemId, কেবল ফিরে আসুন 0Lবা nullএটি কোথাও ব্যবহার করবেন না। আমি কোনও স্পষ্ট কারণ দেখতে পাচ্ছি না কেন কোনও ইউআইডি longআইডির জন্য কিছু মূল্য অপেক্ষা বেশি মূল্যবান হতে পারে । সংযোগ বিচ্ছিন্ন মোড? ওটা কী?
জেমস

1
@ বিনিব: নিকোলাসের অর্থ হ'ল ইউআইডিএস দিয়ে, কোনও নেটওয়ার্ক সংযোগ না থাকলেও বৈধ ইউনিক আইডি (যেমন আপনার মোবাইল ডিভাইসে) তৈরি করা এখনও সম্ভব।
লেবীয়

32

ঠিক আছে, দেখে মনে হচ্ছে এই প্রশ্নের উত্তর সহজ এবং আরও সহজভাবে দেওয়া যেতে পারে ... :-)

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

  • ভিউ নিজেই একটি রেফারেন্স,
  • তালিকায় এর সংখ্যাগত অবস্থান,
  • এটি longআপনি পৃথক উপাদানগুলির সাথে সংযুক্ত আছেন।

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

এটি সাধারণত কী করে তা নিয়ে ভুল বোঝাবুঝি একটি সাধারণ সম্মেলন থেকেই ঘটে। সমস্ত অ্যাডাপ্টারের একটি তত্সহীন getItemId()তৃতীয় পরিচয়টি ব্যবহার না করা হলেও একটি সরবরাহ করতে হবে। সুতরাং, কনভেনশন অনুসারে, সেই অ্যাডাপ্টারগুলি (এসডিকে বা ওয়েবের চারপাশে থাকা নমুনাগুলির মধ্যে অনেকগুলি সহ) কেবলমাত্র positionএকক কারণে ফিরে আসে : এটি সর্বদা অনন্য। তবুও, যদি কোনও অ্যাডাপ্টার ফিরে আসে তবে এর positionঅর্থ হ'ল এটি এই বৈশিষ্ট্যটি মোটেই ব্যবহার করতে চান না, যেহেতু positionইতিমধ্যে পরিচিত, যাইহোক।

সুতরাং, আপনার যদি উপযুক্ত দেখা অন্য কোনও মান ফিরিয়ে দিতে হয় তবে তা নির্দ্বিধায়:

@Override
public long getItemId(int position) {
  return data.get(position).Id;
}

1
এটির জন্য দুর্দান্ত ব্যাখ্যা getItemId()... যখন / যদি এই পদ্ধতিটি আপনার কাস্টম অ্যাডাপ্টারে ওভাররাইড করা হয় না তখন কী হবে?
dentex

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

ধন্যবাদ। আমি এই পদ্ধতিটি সর্বদা সতর্কতা ছাড়াই মন্তব্য করে এসেছি। আমার কাছে একটি কাস্টমএডাপ্টার "হোল্ডার প্যাটার্ন" ব্যবহার করে অ্যারিএডাপ্টার <কাস্টমলিস্ট আইটেম> গেটকাউন্ট (), গেটআইটেম (...) এবং গেটভিউ (...) সহ প্রসারিত করেছে । কৌতূহলের মাত্র বাইরে ...
dentex

হ্যাঁ, আপনি এটি করতে পারেন কারণ অ্যারেএডাপ্টার বেসএডাপ্টার প্রসারিত করে এবং ইতিমধ্যে এর নিজস্ব বাস্তবায়ন সরবরাহ করে।
গ্যাবার

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

6

getItemIdপদ্ধতি মূলত এক্সিকিউটেবল-এর পাথ যে SQLite ডাটাবেস দ্বারা ব্যাক হয় এর সাথে কাজ করা ডিজাইন করা হয়েছে। এটি অবস্থান 1 এ আইটেমটির জন্য অন্তর্নিহিত কার্সারের আইডি ক্ষেত্রটি ফিরিয়ে দেবে।

আপনার ক্ষেত্রে আইটেমের জন্য পজিশনে আইডি নেই 1: আমি ধরে নিচ্ছি অ্যারেএডাপ্টারের বাস্তবায়নটি কেবল -1 বা 0 প্রদান করে।

সম্পাদনা: বাস্তবে, এটি কেবলমাত্র অবস্থানটি ফিরিয়ে দেয়: এক্ষেত্রে 1


2
না এটি ফিরে আসে -1। এখানে বাস্তবায়নটি হচ্ছেassert false : "TODO"; return -1;
আরডিএস

5
অ্যান্ড্রয়েড ৪.১.১-এর হিসাবে, এটি অবস্থানটি ফিরিয়েছে
রেপোসিতোরি.

4

আমি উল্লেখ করতে চাই যে বাস্তবায়নের পরে getItemএবং getItemIdআপনি অ্যাডাপ্টারের পরিবর্তে সরাসরি ডেটা অ্যাক্সেস করতে আপনি তালিকাভিউ.জেটআইটেমটিট পজিশন এবং তালিকাভিউ.সেটটি আইটেম পজিশনটি ব্যবহার করতে পারেন । অনক্লিক শ্রোতার প্রয়োগ করার সময় এটি বিশেষত কার্যকর হতে পারে।


3
আপনার লিস্টভিউতে যদি শিরোনাম থাকে এবং ক্লিক হ্যান্ডলারের কাছে
এনট্রপি

4

আপনি যদি getItemIdসঠিকভাবে প্রয়োগ করেন তবে এটি খুব কার্যকর হতে পারে।

উদাহরণ:

আপনার অ্যালবামগুলির একটি তালিকা রয়েছে:

class Album{
     String coverUrl;
     String title;
}

এবং আপনি getItemIdএই মত বাস্তবায়ন :

@Override
public long getItemId(int position){
    Album album = mListOfAlbums.get(position);
    return (album.coverUrl + album.title).hashcode();
}

এখন আপনার আইটেম আইডিটি কভারআরএল এবং শিরোনাম ক্ষেত্রগুলির মানগুলির উপর নির্ভর করে এবং আপনি যদি তখন পরিবর্তন হয়ে থাকেন এবং notifyDataSetChanged()আপনার অ্যাডাপ্টারে কল করেন তবে অ্যাডাপ্টারটি প্রতিটি উপাদানটির getItemId () পদ্ধতিটি কল করবে এবং কেবল থোড আইটেম আপডেট করবে যা আইডি পরিবর্তিত হয়েছে।

আপনার যদি কিছু "ভারী" অপারেশন করা হয় তবে এটি খুব কার্যকর getView()

বিটিডাব্লু: আপনি যদি এটি কাজ করতে চান তবে আপনার hasStableIds()পদ্ধতিটি মিথ্যা বলে প্রত্যাবর্তন করতে হবে তা নিশ্চিত করতে হবে ;


এটি একটি মূল্যবান পর্যবেক্ষণ, আপনি এই নির্বাচনী আপডেট ব্যবস্থাকে ব্যাক করতে কিছু তথ্য সরবরাহ করতে পারেন?
জেইমি Agudo

কেন hasStableIds()মিথ্যা ফেরা উচিত ? আমার কাছে মনে হচ্ছে একই স্ট্রিং থেকে গণনা করা হ্যাশকোড প্রতিবার একই মানটি ফিরিয়ে আনবে, যা ডক্স অনুসারে একটি স্থায়ী আইডি ।
বিগ ম্যাকলার্জহিউজ

বিবেচনা করুন যে হ্যাশকোড ব্যবহার করা দুটি স্ট্রিংয়ে সত্য ফিরে আসতে পারে
htafoya

2

getItemবা getItemIdতালিকার আইটেমগুলির সাথে মূলত সংযুক্ত ডেটা ডিজাইন করার জন্য কয়েকটি পদ্ধতি রয়েছে। ক্ষেত্রে getItem, আপনি তালিকার আইটেমটি সংযুক্ত করা হবে যে কোনও বস্তু পাস করতে পারেন। সাধারণত মানুষ ফিরে আসে null। আপনি তালিকার একই আইটেমটির সাথে সংযুক্ত করতে পারেন getItemIdএমন কোনও অনন্য longমান। লোকেরা সাধারণত তালিকায় অবস্থান ফিরিয়ে দেয়।

এর ব্যাবহার কি. ঠিক আছে, এই মানগুলি তালিকার আইটেমটির সাথে আবদ্ধ, ব্যবহারকারীরা আইটেমটিতে ক্লিক করলে আপনি এগুলি বের করতে পারেন। এই মানগুলি AdapterViewপদ্ধতির মাধ্যমে অ্যাক্সেসযোগ্য ।

// template class to create list item objects
class MyListItem{
    public String name;
    public long dbId;

    public MyListItem(String name, long dbId){
        this.name = name;
        this.dbId = dbId;
    }
}

///////////////////////////////////////////////////////////

// create ArrayList of MyListItem
ArrayList<MyListItem> myListItems = new ArrayList<MyListItem>(10);

// override BaseAdapter methods
@Override
public Object getItem(int position) {
    // return actual object <MyListItem>
    // which will be available with item in ListView
    return myListItems.get(position);
}

@Override
public long getItemId(int position) {
    // return id of database document object
    return myListItems.get(position).dbId;
}

///////////////////////////////////////////////////////////

// on list item click, get name and database document id
my_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // extract item data
        MyListItem selectedItem = (MyListItem)parent.getItemAtPosition(position);      
        System.out.println("Your name is : " + selectedItem.name);

        // extract database ref id
        long dbId = id;

        // or you could also use
        long dbId = parent.getItemIdAtPosition(position);
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.