2015-01-15 14 views
28

स्पर्श किए जाने तक कुछ भी नहीं दिखाता है, मैं अपने ऐप में समर्थन RecyclerView का उपयोग कर रहा हूं, और मुझे सबसे विचित्र चीज़ दिखाई देती है। जब तक मैं स्क्रॉल करने के लिए स्पर्श नहीं करता तब तक यह कोई आइटम प्रदर्शित नहीं करता है। फिर, अचानक, RecyclerView खुद को populates। मैंने सत्यापित किया है कि एडाप्टर का समर्थन करने वाली सूची पॉप्युलेट की गई है, और उस पर CreatViewHolder और OnBindViewHolder को टच ईवेंट तक कभी नहीं बुलाया जाता है।समर्थन पुनर्चक्रण दृश्य

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:paddingTop="?attr/actionBarSize"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/lv_inbox" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     ></android.support.v7.widget.RecyclerView> 
</RelativeLayout> 

मैं recyclerview उपयोग कर रहा हूँ:

public class InboxAdapter extends RecyclerView.Adapter<InboxAdapter.ViewHolder> { 
    List<Conversation> mConversations; //initialized in contructor 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = mInflater.inflate(R.layout.inbox_item, parent, false); 
     ViewHolder holder = new ViewHolder(v); 
     Log.d(LOG_TAG, "oncreateviewholder : " + viewType); //never called when I first bind the adapter 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     final Conversation item = mConversations.get(position); 
     Log.d(LOG_TAG, "binding " + position); 
     ... 
    } 

    @Override 
    public int getItemCount() { 
     Log.d(LOG_TAG, "item count: " + mConversations.size()); 
     return mConversations.size(); 
    } 

    /** 
    * Empties out the whole and optionally notifies 
    */ 
    public void clear(boolean notify) { 
     mConversations.clear(); 
     if (notify) { 
      notifyDataSetChanged(); 
     } 
    } 

    public void addAll(List<Conversation> conversations) { 
     mConversations.addAll(conversations); 
     notifyDataSetChanged(); 
    } 


} 

यहाँ लेआउट फ़ाइल है:

@Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     Drawable divider = new ColorDrawable(ProfileInfo.getCurrentProfileColor()); 
     mInboxList.addItemDecoration(new DividerItemDecoration(getActivity(), divider, false)); 
     mInboxList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); 
     mInboxList.setAdapter(new InboxAdapter(getActivity(), new ArrayList<Conversation>())); 
     new AsyncTask<Void, Void, List<Conversation>{ 

       public List<Conversation> doInBackground(...){ 
        //load the conversations 
        return conversations; 
       } 

       public void onPostExecute(List<Conversation> conversations){ 
        ((InboxAdapter) mInboxList.getAdapter()).clear(false); 
        ((InboxAdapter) mInboxList.getAdapter()).addAll(conversations); 

       } 

     }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } 

यहाँ मेरी एडाप्टर के एक सार है:

यहाँ कैसे मैं recyclerview की स्थापना की है -v7: 21.0.3 संस्करण 4.4.4 के साथ एक मोटो एक्स पर चल रहा है।

संपादित करें:

if (mInboxList.getAdapter().getItemCount() > 0) { 
    mInboxList.smoothScrollToPosition(0); 
} 
+0

आप समर्थन लाइब्रेरी 22.2.1 की कोशिश की है? यह कई कीड़े तय की। –

+3

आपका 'EDIT' उत्तर होना चाहिए :) –

+0

वाह ... क्या यह एंड्रॉइड बग है? यह अभी भी – Zyoo

उत्तर

-2

यह है क्योंकि आप RecyclerView.Adapter की सही सूचना विधियां बुला नहीं कर रहे हैं सबसे अधिक संभावना है: onPostExecute के अंत में निर्बाध स्क्रॉल समस्या को हल करने के लिए लगता है। आपके पास पहले से ListAdapters में आपके लिए एक और अधिक बारीक इंटरफ़ेस है। उदाहरण के लिए, addAll() में आपको

+3

क्या आप सुझाव दे रहे हैं कि सूचित करेंडेटासेट चेंज यूआई अपडेट नहीं करेगा? – WindsurferOak

+0

सूचित करें ItemRangeInserted (पुराना कनवर्सेशंस आकार, बातचीत.size()) इस मुद्दे को हल नहीं किया। –

-1

के बजाय notifyItemRangeInserted(oldConversationsSize, conversations.size()) पर कॉल करना चाहिए, आपको UI थ्रेड पर POSTExecute पर जो सामान आप करते हैं उसे चलाने के लिए आपको रीसाइक्लर व्यू को फिर से खींचा जाना चाहिए। यही कारण है कि चिकनी स्क्रॉलिंग काम करता है, क्योंकि यह यूआई थ्रेड पर चल रहा है और इसलिए दृश्य को फिर से निकालने का कारण बनता है।

+2

onPostExecute मुख्य धागे में चलता है। – WindsurferOak

4

यदि किसी और को RxJava और Retrofit का उपयोग करके यह समस्या हो रही है, तो मैंने सब्सक्राइब करने से पहले .observeOn(AndroidSchedulers.mainThread()) ऑपरेटर को मेरी विधि श्रृंखला में जोड़कर इस समस्या को हल किया। मैंने पढ़ा था कि इसे डिफ़ॉल्ट रूप से ख्याल रखा गया था, और इस प्रकार स्पष्ट रूप से आवश्यक नहीं है, लेकिन मुझे नहीं लगता है। उम्मीद है की यह मदद करेगा।

उदाहरण:

public void loadPhotos() { 
    mTestPhotoService.mServiceAPI.getPhotos() 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()) 
           .subscribe(photoList -> mRecyclerActivity.OnPhotosLoaded(photoList)); 
} 
+0

क्योंकि पृष्ठभूमि धागे पर सब्सक्राइब विधि कहा जा रहा है। इसके लिए मूल कारण है। – ImMathan

+0

सही। मैंने इसे बेहतर ढंग से चित्रित करने के लिए श्रृंखला में सदस्यता छोड़ दी है। – saganaut

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