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


162

আমার একটি কাস্টম তালিকা অ্যাডাপ্টার রয়েছে:

class ResultsListAdapter extends ArrayAdapter<RecordItem> {

ওভাররাইড হওয়া 'গেটভিউ' পদ্ধতিতে আমি অবস্থানটি কী এবং এটি রূপান্তর ভিউ কিনা তা যাচাই করার জন্য একটি মুদ্রণ করি do

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        System.out.println("getView " + position + " " + convertView);

এর আউটপুট (তালিকাটি প্রথম প্রদর্শিত হয়, এখনও পর্যন্ত কোনও ব্যবহারকারী ইনপুট)

04-11 16:24:05.860: INFO/System.out(681): getView 0 null  
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8  
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8  
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8  
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8  
04-11 16:25:50.251: INFO/System.out(681): getView 1 null  
04-11 16:26:01.300: INFO/System.out(681): getView 2 null  
04-11 16:26:02.020: INFO/System.out(681): getView 3 null  
04-11 16:28:28.091: INFO/System.out(681): getView 0 null  
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0  
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0  
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0  

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

  • কেন প্রতিটি দফায় সারসংক্ষেপের জন্য তিনবার বলা হয়?
  • আমি এখনও স্ক্রোল না করে এই রূপান্তর ভিউগুলি কোথা থেকে আসবে?

আমি কিছুটা গবেষণা করেছিলাম, এবং ভাল উত্তর না পেয়ে আমি লক্ষ্য করেছি যে লোকেরা এই সমস্যাটিকে লেআউট সংক্রান্ত সমস্যার সাথে যুক্ত করছে। সুতরাং ক্ষেত্রে, তালিকা রয়েছে এমন বিন্যাসটি এখানে:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent" 
    android:orientation="vertical" >

    <TextView android:id="@+id/pageDetails"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" />

    <ListView android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="false" />

</LinearLayout>

এবং প্রতিটি স্বতন্ত্র সারির বিন্যাস:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"    
android:padding="4dp">

<ImageView
    android:id="@+id/thumb"        
    android:layout_width="120dp"
    android:layout_height="fill_parent"        
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginRight="8dp"        
    android:src="@drawable/loading" />

<TextView  
    android:id="@+id/price"
    android:layout_width="wrap_content"
    android:layout_height="18dp"         
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentBottom="true"       
    android:singleLine="true" />

<TextView  
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="18dp"         
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true" 
    android:paddingRight="4dp"       
    android:singleLine="true" />

<TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="17dp" 
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:paddingRight="4dp"   
    android:layout_alignWithParentIfMissing="true"
    android:gravity="center" />

</RelativeLayout>

সময় দেয়ার জন্য ধন্যবাদ

উত্তর:


271

এটি কোনও ইস্যু নয়, অর্ডারে কাকে getView()ডাকা হবে বা কতবার ডাকা হবে তার কোনও গ্যারান্টি নেই । আপনার নির্দিষ্ট ক্ষেত্রে আপনি একটি সঙ্গে খারাপ জিনিস সম্ভব করছেন ListViewএটি একটি দিয়ে height=wrap_contentListViewলেআউট সময়ে অ্যাডাপ্টারের বাইরে কয়েকটি বাচ্চাকে পরিমাপ করতে বাধ্য করে, এটি কতটা বড় হওয়া উচিত তা জানতে। এই প্রদান করে ListViewসঙ্গে convertViewsআপনি প্রেরণ দেখুন getView()এমনকি আগে আপনি স্ক্রোল করুন।


10
আমি এটির কোনও ভাল কারণ খুঁজে পাই না। আপনি যদি পরিবর্তন করতে সক্ষম হতে চান তবে এটি ঠিক আছে, তবে বর্তমানে কেন এটি এই আচরণ করছে তা উত্তর দিচ্ছে না?
সিডিপনেট

45
@cdpnet তিনি বলেছিলেন কেন এটা এরকম হয়েছে, আপনার ListViewউচ্চতা রয়েছে wrap_content, তাই এটি নিশ্চিত করুন যে এটি উচ্চতার নয় সুতরাং এটা পরীক্ষক এক ধরনের হিসেবে কিছু শিশু টিম সীমানা তা দেখতে মধ্যে মাপসই করা হবে। পরিবর্তন করুন আপনার ListViewকাছে fill_parentতারপর আপনার লগ পরীক্ষা কলগুলি নাটকীয়ভাবে হ্রাস করা উচিত।
ব্লুন্ডেল

4
২.৩ এবং ৪.x যুগের তালিকাভিউর মধ্যে আচরণটি উল্লেখযোগ্যভাবে পরিবর্তিত হয়েছে। হস্তক্ষেপটি হ'ল তালিকাগুলির নকশা যেমন তৈরি করা হয়েছে, আপনার ঘর / তালিকা_প্রেমগুলি খাঁটি দৃষ্টিভঙ্গি হওয়া দরকার এবং তাদের দ্রুত অঙ্কনের জন্য অনুকূলিত করা দরকার। লিস্টভিউতে গুগল আই / ও আলাপ অনুসারে, যেখানে রোমেন উপস্থাপিত হয়েছে, গেটভিউকে কেবল ভিউ রেন্ডারিং অনুকূল করতে এবং ফলাফলটি বাতিল করতে বলা হতে পারে। যদিও আমার মতে এটি আইওএস ইউআইটিএবলভিউয়ের মতো বিকাশকারী বান্ধব নয়, এটি এটি কেমন।
ক্যামেরন লোয়েল পামার

4
তোমাকে অনেক ধন্যবাদ! গেটভিউ ()টিকে প্রায়শই কেন ডাকা হয় তা আমি বুঝতে পারি নি। আমি পিতা-মাতাকে পূরণ করার জন্য মোড়ক_সামগ্রী বন্ধ করে দিয়েছি এবং এখন আমার অ্যাপ্লিকেশনটি আবার দ্রুত হয়েছে :)
জুলিয়া হেক্সেন

28
লেআউট_হাইট = র‌্যাপ_কন্টেন্টে তালিকাভিউগুলি সেট করার সময় একটি সতর্কতা থাকা উচিত কারণ এটি এতগুলি কার্য সম্পাদন সমস্যা তৈরি করে।
নাথানিয়েলল্ফ

53

দিয়ে চেষ্টা match_parentউপর layout_heightতালিকা দেখুন সম্পত্তি। এটি getView()প্রায়শই ডাকা আটকাবে ।


4
নোট করুন যে ফ্রেড টি লিস্ট ভিউয়ের লেআউট_ উচ্চতা নির্দিষ্ট করে ... সারিটি নয়, যা আমি বারবার চেষ্টা করেছি
mblackwell8

8
নোট যা এপিআই স্তরের 8 এবং উচ্চতর দ্বারা fill_parentপ্রতিস্থাপন করা উচিত match_parent
জেসন অ্যাকসেলসন

আমি মনে করি getView () পদ্ধতিটি তালিকাভিউয়ের জন্য ম্যাচ_প্যারেন্ট হিসাবে প্রস্থ এবং উচ্চতা নির্ধারণ করে একাধিক সময় কল করবে কেবলমাত্র পারফরম্যান্স সমস্যার সমাধান করবে।
কুওং ভো

45

আমি এই সমস্যা থেকে মুক্তি পেয়েছি যখন আমি লেআউট_ প্রস্থ এবং লেআউট_ উচ্চতা উভয়ই ম্যাচ_প্যারেন্টে পরিবর্তন করেছি (কেবলমাত্র বিন্যাস_র উচ্চতায় পরিবর্তন সাহায্য করবে না)।


সহায়ক নোটটি আপনার যদি নেস্টেড আইটেমগুলি থাকে তবে নজর রাখুন । আপনি "সর্বোচ্চ" একটিকে পিতামাতার সাথে পরিবর্তন করতে পারেন । আশা করি এটি কাউকে সাহায্য করবে।


একটি শব্দ বন্ধু "দুর্দান্ত" তবে কেন জানি না যে মোড়ক_কন্টেন্ট সমস্যা তৈরি করছে। এটি আমার সমস্যা সমাধান করেছে।
অ্যান্ড্রয়েড কিলার

@AndroidKiller যখন আপনি ব্যবহার wrap_content, তারপর ListViewজানি না আইটেমটি কত তালিকা আছে তালিকা সামগ্রী থাকে পরিণত, তাই বলে ListViewচেষ্টা অনেক সারি হিসাবে তৈরি করতে যেমন মনে করে প্রদর্শনে উপযুক্ত, এবং যখন আপনি ব্যবহার fill_parentবা match_parent, ListViewমনে মনে বলে, ঠিক আছে, আমার উচ্চতা হয় xএবং আমার nদেখানোর জন্য অনেকগুলি সারি প্রয়োজন ।
আদিল সোমো

তোমাকে অনেক ধন্যবাদ ! একাধিক কলের কারণে এই আচরণের সাথে চিত্রগুলি এলোমেলোভাবে পরিবর্তিত হয়েছিল ... এখন প্রথম থেকেই এটি ঠিক আছে।
Chostakovich

7

আমি আপনার "কেন" প্রশ্নের উত্তর দিতে পারছি না তবে বিরক্তিকর "তালিকার আইটেমগুলি পুনরাবৃত্তি করা " সমস্যাটির সমস্যাটির সমাধান অবশ্যই আমার কাছে রয়েছে (যদি আপনার কাছে সংগ্রহের আইটেমগুলি থাকে যা পর্দার উচ্চতার চেয়ে বেশি হয়)।

উপরোক্ত আলোচনা অনেক মানুষ উল্লেখ করেছি, রাখা layout_height: Android এর সম্পত্তি ListVew যেমন ট্যাগ fill_parent

আর getView () ফাংশন সম্পর্কে, সমাধান ব্যবহার করা স্ট্যাটিক বর্গ নামক ViewHolder । পরীক্ষা করে দেখুন এই উদাহরণ। এটি সফলভাবে ইউর অ্যারে বা অ্যারে ক্লেকশনে সমস্ত আইটেম যুক্ত করার কাজ করে।

আশা করি এটি বন্ধুদের সহায়তা করবে !!

শুভেচ্ছা, সিদ্ধন্ত


অ্যান্ড্রয়েড (প্রাক আইসিএস) এর প্রাথমিক সংস্করণে ভিউহোল্ডার প্যাটার্নটি ব্যবহার সম্পর্কে সতর্ক থাকুন কারণ এটি আপনাকে মেমোরিলিক ব্যতিক্রমের দিকে নিয়ে যেতে পারে। এটি আইসিএস + সংস্করণে নির্দ্বিধায় ব্যবহার করুন।
ওয়াহিদ গাদিরি

@ সিদ্ধান্ত ধন্যবাদ আমি আমার ছবি GridViewপরিবর্তন করার android:layout_heightএবং পরিবর্তন করার কারণ খুঁজে বের করার জন্য একটি দিন ব্যয় করেছি এবং আমার android:layout_widthপক্ষে কাজ করে না। তবে ViewHolderআমার জন্য স্থির পুনরাবৃত্তি চিত্রগুলি ব্যবহার করে আমি এই টিউটোরিয়ালটি দিয়েছিলাম android-vogue.blogspot.com/2011/06/…
নিকোলে পোডলনি

4

অনুসন্ধান: অ্যাডাপ্টার কেন ভিউ () কে বহুবার কল করে? উত্তর: লিস্টভিউ যেমন স্ক্রোলিংয়ে রেন্ডার করে তা আগত আগত দর্শনগুলির সাথে তার দৃশ্যটিকে রিফ্রেশ করে, যার জন্য অ্যাডাপ্টারের গেট ভিউ () কল করে ভিউগুলি পাওয়া দরকার।

অনুসন্ধান: তালিকার প্রস্থ এবং উচ্চতা পূরণ_পিত্তিতে সেট করা থাকলে কেন এটি কম কল হয়? উত্তর: কারণ স্ফীত হিসাবে পর্দার ক্ষেত্রের জন্য নির্দিষ্ট আকারের তালিকার জন্য এটি স্ক্রিনে দর্শনগুলি রেন্ডার করার জন্য একবার গণনা করে।

আশা করি এটি আপনার প্রশ্নের সমাধান করবে।


দুর্দান্ত ব্যাখ্যা। তবে ম্যাচ_ পিতামাতার আরও ভাল পছন্দ হতে পারে।
ফ্যাটি

হ্যাঁ @ জো ব্লো, এপিআই ২.৪ / ৩.৩ থেকে ফিল_প্যারেন্টের পরিবর্তে ম্যাচ_প্যারেন্ট ব্যবহার করার পরামর্শ দেওয়া হয়েছে
জিতেন শর্মা

4

অটো কমপ্লিটটেক্সটভিউতে ড্রপডাউন নিয়ে আমার একই সমস্যা ছিল। আমি এখানে না আসা পর্যন্ত আপনি দু'দিন ধরে সমস্যার সাথে লড়াই করে যাচ্ছিলাম এবং আপনি আমাকে সমাধানটি প্রদর্শন করবেন show

যদি আমি ড্রপডাউনহাইট = "ম্যাচ_পিতা" লিখি তবে সমস্যাটি স্থির। এখন সমস্যাটি ইউআই সম্পর্কিত (যখন আপনার কাছে একটি আইটেম রয়েছে তখন ড্রপডাউন অনেক বড়) তবে একাধিক কল (আরও গুরুত্বপূর্ণ) এর সমস্যাটি স্থির হয়েছে।

ধন্যবাদ!!


2

"প্রতিটি সারির জন্য তিনবার কেন ভিউভিউ বলা হয়?" কারণ আপনি যখন ভিভিউকে তালিকার স্ক্রোল করার সময় এবং আরও ভাল বলতে বলা হয় তখন যখন আপনার তালিকার ভিউয়ের অবস্থান পরিবর্তন হয় তখনই তাকে ডাকা হয়!


ঠিক আছে, তবে দৃশ্যটি পরিবর্তন হয়নি। ক্রিয়াকলাপটি শুরু হওয়ার সাথে সাথে স্ক্রিনে চারটি সারি ভিউ রয়েছে এবং কোনও স্ক্রোলিং বা কোনও ব্যবহারকারীর ইনপুট ছাড়াই আমি প্রতিটি সারির জন্য তিনটি ভিভিউ কল পাই ...
এডজিলিয়ন

এই উত্তরটি ভুল। সঠিক উত্তরটি হ'ল ** মোড়ানো_কন্টেন্ট ** ব্যবহারের ফলে ভিউ ভিউতে প্রচুর সংখ্যক কল আসে।
ফ্যাটি

2

আমি একই সমস্যা হচ্ছে না। যদি আমার উচ্চতা পূরণের_পিতা নির্ধারণ করা থাকে তবে আমি প্রতি সারিতে "সাধারণত" 2 টি কল পাই। তবে, আমি যদি আমার লিস্টভিউয়ের উচ্চতাটিকে যথাযথ মান হিসাবে নির্ধারণ করি তবে আসুন 300 ডিপি বলি, তবে আমি প্রতি সারিতে ঠিক একটি গেটভিউ কল পাই।

সুতরাং, আমার কাছে মনে হয় একমাত্র উপায় হ'ল প্রথমে পর্দার উচ্চতা নির্ধারণ করা, তারপরে প্রোগ্রামালিমে সেই মানটির তালিকাভুক্তির উচ্চতা নির্ধারণ করুন। আমি এটা পছন্দ করি না। আমি আশা করি এর থেকে আরও ভাল উপায় আছে।


1
তার জন্য ধন্যবাদ. এটি মজার - এই প্রশ্নটি কয়েক মাস ধরে সুপ্ত রয়েছে, গত কয়েক সপ্তাহ ধরে কেবলমাত্র কয়েকটি মন্তব্য প্রকাশিত হতে পারে। আমি আর এই প্রকল্পটি করছি না তবে আমার কিছুটা সময় থাকায় আমি এটি চেষ্টা করে যাচ্ছি এবং তারপরে নিশ্চিত হয়ে এখানে ফিরে আসছি। আবার ধন্যবাদ.
এডজিলিয়ন

এখানে একই, আমি প্রতি সারিতে দুটি কল পাই। সারি 0,1,2,3 এবং তার পরে 100 মিমি পরে আরও 0,1,2,3 - যা সারি দেখা হয় তার পরিসংখ্যান সংগ্রহ করার সময় পাছায় ব্যথা হয়
কেউ কোথাও

2

এখনও তোমাকে যারা সমস্ত (সেটিং পরে heightএর ListViewথেকে match_parent) আটকে (যেমন আমি ছিলাম) আছেন:

আপনাকে heightপ্যারেন্ট লেআউটটি সেট করতে হবে match_parent

নীচে উদাহরণ দেখুন। LinearLayoutএখানে পিতা বা মাতা হল:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/something" />

        <ListView
            android:id="@+id/friendsList"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>


0

আমি এই সমাধানটি তৈরি করেছিলাম, সম্ভবত এটি সেরা নয়, তবে কাজটি করে ...

//initialize control string
private String control_input = " ";

তারপর =

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View gridview = convertView;

    // change input_array for the array you use
    if (!control_input.equals(input_array[position])) {
        control_input = input_array[position];

        //do your magic

    } 

    return gridview;
}

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

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