2015-09-21 12 views
10

मैं वर्तमान में एक एप्लिकेशन विकसित कर रहा हूं जो RecyclerView का उपयोग करता है।RecyclerView.Adapter पर क्रिएटिव्यूहोल्डर को दो बार या अधिक कहा जाता है, कई बार

लॉगकैट की समीक्षा करने पर मैंने देखा कि ऑनक्रेट व्यूहोल्डर को तत्काल बाद दो बार बुलाया गया था।

09-22 05:22:55.209 V/Adapter﹕ Construct 
09-22 05:22:55.213 V/Adapter﹕ onCreateViewHolder 
09-22 05:22:55.224 V/Adapter﹕ onBindViewHolder 
09-22 05:22:55.240 V/Adapter﹕ onCreateViewHolder 
09-22 05:22:55.247 V/Adapter﹕ onBindViewHolder 

इसके अलावा बाइंडव्यूहोल्डर को दो बार बुलाया गया था, हालांकि मुझे पता है कि जब भी आइटम रीसाइक्लिंग होते हैं तो इसे कॉल किया जाता है।

लेकिन मुझे लगता है कि क्रिएटिव्यूहोल्डर के लिए यह एक बार कॉल करने के लिए पर्याप्त है।

क्या यह असामान्य व्यवहार है? यदि हां, तो इसे कैसे ठीक किया जा सकता है?

उत्तर

14

यह असामान्य लेकिन काफी सामान्य व्यवहार नहीं है। आपको चिंता करने की ज़रूरत नहीं है।

यह सच है कि एक व्यूहोल्डर का पुनर्नवीनीकरण किया जाएगा और फिर से फिर से बनाया नहीं जाएगा।

हालांकि, एकाधिक व्यूहोल्डर ऐप की स्क्रीन पर एकाधिक आइटम प्रदर्शित करने के लिए आवश्यक हैं। तो व्यूहोल्डर्स की एक निश्चित संख्या बनाई जाएगी और इसके लिए क्रिएटव्यूहोल्डर को निश्चित समय कहा जाता है।

और जब भी ViewHolders में डेटा रीसेट हो जाता है तो ऑनबिंडव्यूहोल्डर को infinitly कहा जाएगा।

MainActivity:

public class MainActivity extends AppCompatActivity { 
    private static final String[] DATASET = new String[]{ 
      "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", 
      "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     recyclerView.setHasFixedSize(true); 

     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 

     MyAdapter myAdapter = new MyAdapter(DATASET); 
     recyclerView.setAdapter(myAdapter); 
    } 
} 

MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private static final String LOG_TAG = "RecyclerViewAdapter"; 
    private String[] dataset; 

    private int counterOnCreateViewHolder = 0; 
    private int counterOnBindViewHolder = 0; 

    public MyAdapter(String[] dataset) { 
     Log.d(LOG_TAG, "Construct"); 
     this.dataset = dataset; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView textView; 
     public ViewHolder(TextView textView) { 
      super(textView); 
      this.textView = textView; 
     } 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Log.d(LOG_TAG, "onCreateViewHolder (" + ++counterOnCreateViewHolder + ")"); 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.adapter_textview, parent, false); 

     ViewHolder viewHolder = new ViewHolder((TextView) view); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Log.d(LOG_TAG, "onBindViewHolder (" + ++counterOnBindViewHolder + ")"); 
     holder.textView.setText(dataset[position]); 
    } 

    @Override 
    public int getItemCount() { 
     // Log.d(LOG_TAG, "getItemCount"); 
     return dataset.length; 
    } 
} 

लेआउट/activity_main.xml:

<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="vertical" 
    android:id="@+id/recycler_view" /> 

एल

मैं नीचे की तरह परीक्षण आवेदन के साथ इस तथ्य की जांच की ayout/adapter_textview.xml:

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/adapter_textview" 
    android:textSize="30sp" /> 

परिणाम:

09-22 06:03:04.166 D/RecyclerViewAdapter﹕ Construct 
09-22 06:03:05.179 D/RecyclerViewAdapter﹕ onCreateViewHolder (1) 
09-22 06:03:05.183 D/RecyclerViewAdapter﹕ onBindViewHolder (1) 
09-22 06:03:05.190 D/RecyclerViewAdapter﹕ onCreateViewHolder (2) 
09-22 06:03:05.192 D/RecyclerViewAdapter﹕ onBindViewHolder (2) 
09-22 06:03:05.192 D/RecyclerViewAdapter﹕ onCreateViewHolder (3) 
09-22 06:03:05.194 D/RecyclerViewAdapter﹕ onBindViewHolder (3) 
09-22 06:03:05.195 D/RecyclerViewAdapter﹕ onCreateViewHolder (4) 
09-22 06:03:05.197 D/RecyclerViewAdapter﹕ onBindViewHolder (4) 
09-22 06:03:05.198 D/RecyclerViewAdapter﹕ onCreateViewHolder (5) 
09-22 06:03:05.199 D/RecyclerViewAdapter﹕ onBindViewHolder (5) 
09-22 06:03:05.200 D/RecyclerViewAdapter﹕ onCreateViewHolder (6) 
09-22 06:03:05.202 D/RecyclerViewAdapter﹕ onBindViewHolder (6) 
09-22 06:03:05.203 D/RecyclerViewAdapter﹕ onCreateViewHolder (7) 
09-22 06:03:05.204 D/RecyclerViewAdapter﹕ onBindViewHolder (7) 
09-22 06:03:05.206 D/RecyclerViewAdapter﹕ onCreateViewHolder (8) 
09-22 06:03:05.207 D/RecyclerViewAdapter﹕ onBindViewHolder (8) 
09-22 06:03:05.209 D/RecyclerViewAdapter﹕ onCreateViewHolder (9) 
09-22 06:03:05.211 D/RecyclerViewAdapter﹕ onBindViewHolder (9) 
09-22 06:03:05.212 D/RecyclerViewAdapter﹕ onCreateViewHolder (10) 
09-22 06:03:05.213 D/RecyclerViewAdapter﹕ onBindViewHolder (10) 
09-22 06:03:05.215 D/RecyclerViewAdapter﹕ onCreateViewHolder (11) 
09-22 06:03:05.217 D/RecyclerViewAdapter﹕ onBindViewHolder (11) 
09-22 06:03:05.218 D/RecyclerViewAdapter﹕ onCreateViewHolder (12) 
09-22 06:03:05.220 D/RecyclerViewAdapter﹕ onBindViewHolder (12) 
09-22 06:03:55.048 D/RecyclerViewAdapter﹕ onCreateViewHolder (13) 
09-22 06:03:55.050 D/RecyclerViewAdapter﹕ onBindViewHolder (13) 
09-22 06:03:55.228 D/RecyclerViewAdapter﹕ onCreateViewHolder (14) 
09-22 06:03:55.229 D/RecyclerViewAdapter﹕ onBindViewHolder (14) 
09-22 06:03:55.230 D/RecyclerViewAdapter﹕ onCreateViewHolder (15) 
09-22 06:03:55.231 D/RecyclerViewAdapter﹕ onBindViewHolder (15) 
09-22 06:03:55.232 D/RecyclerViewAdapter﹕ onBindViewHolder (16) 
09-22 06:03:55.232 D/RecyclerViewAdapter﹕ onBindViewHolder (17) 
09-22 06:03:55.260 D/RecyclerViewAdapter﹕ onBindViewHolder (18) 
09-22 06:03:55.276 D/RecyclerViewAdapter﹕ onBindViewHolder (19) 
09-22 06:03:55.296 D/RecyclerViewAdapter﹕ onBindViewHolder (20) 
09-22 06:03:55.310 D/RecyclerViewAdapter﹕ onBindViewHolder (21) 

आप देख सकते हैं, केवल onBindViewHolder onCreateViewHolder (15) के बाद बुलाया गया था।

+1

वहाँ किसी भी तरह से, क्योंकि मैं स्क्रॉल में प्रदर्शन मुद्दा है onBindViewHolder विधि के कई कॉल को संभालने के लिए है।। धन्यवाद –

0

आप इस कोड द्वारा पुनर्नवीनीकरण व्यूपूल गिनती बढ़ा सकते हैं। डिफ़ॉल्ट रूप से इसमें 5.

आप अपनी आवश्यकता के अनुसार बढ़ सकते हैं।

recyclerView.getRecycledViewPool() setMaxRecycledViews (0,50); // 0 - अपने दृश्य प्रकार

संबंधित मुद्दे