2015-01-15 16 views
28

Uygulamamdaki RecyclerView desteğini kullanıyorum ve en tuhaf şeyi görüyorum. Kaydırmak için dokunulana kadar hiçbir öğe görüntülenmiyor. Sonra, birdenbire, RecyclerView kendini doldurur. Bağdaştırıcıyı destekleyen listenin doldurulduğunu ve onCreatViewHolder ile onBindViewHolder öğesinin dokunma olayına kadar hiçbir zaman çağrılmadığını doğruladım.Destek RecyclerView dokunulana kadar hiçbir şey göstermiyor

<?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> 

Ben recyclerview kullanıyorum: Burada

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(); 
    } 


} 

düzen dosyasıdır: Burada
@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); 
    } 

Adaptörümdeki bir özü var: Burada

Ben recyclerview kurmak nasıl -v7: 21.0.3 sürüm 4.4.4 ile bir Moto X üzerinde çalışıyor.

DÜZENLEME: Eğer RecyclerView.Adapter doğru bildirim yöntemleri demeyeceğiz, çünkü büyük ihtimalle

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

Destek Kitaplığı 22.2.1 denediniz mi? Birçok hata düzeltildi. –

+3

'EDIT' cevabınız olmalı :) –

+0

wow ... bu android hata mı? – Zyoo

cevap

-2

: OnPostExecute sonunda Akıcı kaydırma sorunu çözmek gibi görünüyor. ListAdapters'da daha önce sahip olduğunuzdan çok daha ayrıntılı bir arayüze sahipsiniz. Örneğin, addAll içinde() Eğer notifyItemRangeInserted(oldConversationsSize, conversations.size()) yerine

+3

NotifyDataSetChange, UI'yi güncelleştirmeyecek mi? – WindsurferOak

+0

notifyItemRangeInserted (oldConversationsSize, conversations.size()) sorunu çözmedi. –

-1

notifyDataSetChanged Seni RecyclerView yeniden çizilmesi alır böylece UI iş parçacığı üzerinde OnPostExecute yapmak şeyler çalıştırmak zorunda kalacak çağırmalıdır. Bu yüzden düzgün kaydırma çalışır, çünkü UI iş parçacığı üzerinde çalışır ve bu nedenle görünümün yeniden çizilmesine neden olur. Başkasının RxJava ve Sonradan montaj kullanarak bu sorunu almaya ise

+2

onPostExecute, ana iş parçacığında çalışır. – WindsurferOak

4

, ben abone olmadan önce benim yöntem zincirine .observeOn(AndroidSchedulers.mainThread()) operatörü ekleyerek bu sorunu çözdü. Bunu varsayılan olarak dikkatle okudum ve bu nedenle açıkça gerekli değil, ama sanırım değil. Bu yardımcı olur umarım.

Örnek:

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

Abone yöntemi arka plan iş parçacığı üzerinde çağrılıyor çünkü. Bunun temel sebebi bu. – ImMathan

+0

Doğru. Bunu daha iyi göstermek için .subscribeOn() öğesini zincire ekledim. – saganaut

İlgili konular