অ্যান্ড্রয়েড: একটি তালিকাভিউ থেকে সন্তানের দর্শনগুলি অ্যাক্সেস করুন


108

একটি ব্যবহার করে প্রদর্শিত তালিকায় একটি উপাদানের পিক্সেল অবস্থান আমার সন্ধান করতে হবে ListView। দেখে মনে হচ্ছে আমার কাছে টেক্সটভিউ এর একটি পাওয়া উচিত এবং তারপরে ব্যবহার করা উচিত getTop()তবে কীভাবে একটি এর শিশু দর্শন পাবেন তা আমি বুঝতে পারি না ListView

আপডেট:ViewGroup তালিকার আইটেমগুলির সাথে একটির জন্য, বাচ্চাদের ছেলেরা 1-থেকে -1 এর সাথে মিল রাখে না ListView। পরিবর্তে, এই ViewGroupমুহুর্তে দৃশ্যমান কেবলমাত্র সেই দর্শনগুলির সাথেই বাচ্চাদের সন্তানদের মিল রয়েছে। সুতরাং getChildAt()এমন একটি সূচকে পরিচালনা করে যা অভ্যন্তরীণ ViewGroupএবং এটি ListViewব্যবহার করে তালিকার অবস্থানের সাথে অগত্যা কিছু করার নেই ।

উত্তর:


215

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

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

সুবিধাটি হ'ল আপনি তালিকাভিউর বাচ্চাদের উপরে পুনরাবৃত্তি করছেন না, যা একটি পারফরম্যান্স হিট করতে পারে।


10
দুর্দান্ত উত্তর, তবে আপনার তালিকায় শিরোনামের দৃষ্টিভঙ্গি উপস্থিত থাকলে ঠিক কাজ করবে না। অ্যাসাইনমেন্টটি এটি ঠিক করা firstPositionউচিত int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
pospi

@ স্পপি: ধন্যবাদ, ভাল পয়েন্ট! আমি তার জন্য অ্যাকাউন্টে আমার উত্তর আপডেট করেছি।
জো 19

বেশিরভাগ ক্ষেত্রে ভাল উত্তর এবং কাজ করে, তবে কেন আপনি বিশ্বাস করেন যে সন্তানের দৃষ্টিভঙ্গি তারা ক্রিয়াকলাপের বিন্যাসে রয়েছে তার ক্রমে প্রদর্শিত হয়। যেহেতু দর্শনগুলি পুনরায় ব্যবহার করা যায় আমরা কীভাবে নিশ্চিত হতে পারি যে প্রথম দর্শনটি শেষ দৃশ্যমান দৃশ্যের প্রতিনিধিত্ব করে না?
ভিক্টর ডেনিসভ

2
@ ভিক্টরডেনিসভ: এটি কেবল ইউআই থ্রেডে ঘটতে পারে; সুতরাং এই কোডটি কার্যকর করার সময় ইউআই থ্রেডটি ব্লক করা হবে, সুতরাং সন্তানের মতামতগুলি স্থিতিশীল এবং পরিবর্তিত হবে না। ListViewইতিমধ্যে হ্যান্ডলিং হয় "চলন্ত" শিশু মতামত পুরাতন রিসাইক্লিং পর প্রায় convertView, এস, ইত্যাদি যাতে আপনি করতে পারেন নিশ্চিত করা যে ListView.getChildAt(0) হয় অ্যাডাপ্টারের থেকে প্রথম সংযুক্ত দৃশ্য আসলে। এটি সম্পূর্ণরূপে দৃশ্যমান নাও হতে পারে (এবং ListViewএটি "দৃশ্যমানতার" দ্বারপ্রান্তের উপর নির্ভর করে কোনও দৃশ্যের পুনর্বিবেচনা করার আগে এটি "দৃষ্টির বাইরে স্ক্রোলড" বলে বিবেচনা করে)
জো

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

17

এই কোডটি ব্যবহার করা সহজ:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }

9
সবসময় কাজ করে না। getChildAt প্রথম দৃশ্যমান সারি থেকে গণনা করা হয়, তথ্যের শীর্ষ থেকে নয়।
স্টিলবাইটস

13
ভিউআইডি যুক্তি বিভ্রান্তিকর। এটি একটি সূচক (বা অবস্থান)। ভিউ আইডি অপ্ট সরঞ্জাম দ্বারা উত্পাদিত একটি সম্পূর্ণ নির্বিচারে পূর্ণসংখ্যা।
জোহান পেলগ্রিম

6

লিস্টভিউ শ্রেণীর জন্য দস্তাবেজের একটি দ্রুত অনুসন্ধান ভিউগ্রুপ থেকে উত্তরাধিকার সূত্রে getChildCount () এবং getChildAt () পদ্ধতিতে সক্রিয় হয়েছে। আপনি কি এগুলি ব্যবহার করে তাদের মাধ্যমে পুনরাবৃত্তি করতে পারেন? আমি নিশ্চিত নই তবে এটি চেষ্টা করার মতো worth

এটি এখানে খুঁজে পেয়েছি


1
নির্বাচন করার জন্য আমি এটি চেষ্টা করেছি। এটি সাধারণত কাজ করে তবে মাঝে মাঝে একের পর এক ত্রুটি থাকে এবং এটি নির্ভরযোগ্য নয়। আমি এটি সুপারিশ করব না।
টিএমএমএম

ধন্যবাদ টিমম্মম, আমি আসলে এটি ডক্সে এটি সন্ধান করার চেষ্টা করিনি।
পাদদেশ

5
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
        View v;
        int count = parent.getChildCount();
        v = parent.getChildAt(position);
        parent.requestChildFocus(v, view);
        v.setBackground(res.getDrawable(R.drawable.transparent_button));
        for (int i = 0; i < count; i++) {
            if (i != position) {
                v = parent.getChildAt(i);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

মূলত, দুটি ড্রয়যোগ্য তৈরি করুন - একটি স্বচ্ছ, এবং অন্যটি পছন্দসই রঙ। ক্লিক করা অবস্থানে ( int positionসংজ্ঞায়িত হিসাবে) ফোকাসের অনুরোধ করুন এবং উল্লিখিত সারিটির রঙ পরিবর্তন করুন। তারপরে অভিভাবকের মধ্য দিয়ে চলুন ListViewএবং সেই অনুযায়ী অন্য সমস্ত সারি পরিবর্তন করুন। যখন কোনও ব্যবহারকারী listviewএকাধিকবার ক্লিক করে থাকে তখন এটির জন্য অ্যাকাউন্টগুলি । এটি প্রতিটি সারিটির জন্য একটি কাস্টম বিন্যাসের সাহায্যে সম্পন্ন করা হয় ListView। (খুব সাধারণ, একটি দিয়ে একটি নতুন লেআউট ফাইল তৈরি করুন TextView- ফোকাসযোগ্য বা ক্লিকযোগ্য সেট না করে!)।

কোনও কাস্টম অ্যাডাপ্টারের প্রয়োজন নেই - ব্যবহার করুন ArrayAdapter


getChildAt বর্তমান স্ক্রোলড আইটেমগুলির সাথে সম্পর্কিত। আপনি যদি আপনার তালিকাটি কিছুটা স্ক্রোল করেন তবে এটি কাজ করা বন্ধ করবে।
নুরেটিন


-9

এটি ধরে নিয়েছে যে আপনি তালিকার ভিউটিতে উপাদানটির অবস্থান জানেন:

  View element = listView.getListAdapter().getView(position, null, null);

তারপরে আপনার পর্দার অবস্থানের উপাদানগুলি নির্ধারণ করতে getLeft () এবং getTop () কল করতে সক্ষম হওয়া উচিত।


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

1
এমনকি অবস্থানটি ভিজ্যুয়াল স্ক্রিনে একটি অবস্থান হবে, অ্যাডাপ্টারের ডেটা উত্সের অবস্থানের নয়।
বিকাশ

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