14

Bu, bir RecyclerView ile veri bağlamada ilk denemem ancak RecyclerView'ın ilk kullanımım değil.RecyclerView ve Veri Ciltleme çalışmıyor

Bazı nedenlerden dolayı bağdaştırıcı yöntemlerinden hiçbiri - getItemCount() bile değil. Bu benim RecyclerView ile aptal bir sorun olabilir ve veri bağlayıcı ile ilgisi yok ama ben yanlış bir şey göremiyorum.

 View rootview = inflater.inflate(R.layout.fragment_profile_first, container, false); 
    // Initialize recycler view 

    RecyclerView badgesRV = (RecyclerView) rootview.findViewById(R.id.badgesRV); 
    LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
    llm.setOrientation(LinearLayoutManager.HORIZONTAL); 
    badgesRV.setLayoutManager(llm); 

    BadgeAdapter badgeAdapter = new BadgeAdapter(profileObject.badgesEntity.badges); 
    badgesRV.setAdapter(badgeAdapter); 

Adaptör: kontrol ettim ve orada veri kesinlikle yoktur

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<data> 
    <variable name="badge" type="parseJsonEntities.requestObjects.BadgeObject"/> 
</data> 

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

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@{badge.badgeImage}"/> 

</LinearLayout> 

public class BadgeAdapter extends RecyclerView.Adapter<BadgeAdapter.BadgeBindingHolder>{ 

    private static final int MAX_BADGES_TO_DISPLAY = 5; 
    private BadgeObject[] badges; 

    public BadgeAdapter(BadgeObject[] badges){ 
     this.badges = badges; 
    } 

    @Override 
    public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.profile_badge_row, parent, false); 
     BadgeBindingHolder holder = new BadgeBindingHolder(v); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(BadgeBindingHolder holder, int position) { 
     final BadgeObject badgeObject = badges[position]; 
     holder.getBinding().setVariable(BR.badge, badgeObject); 
     holder.getBinding().executePendingBindings(); 

    } 

    @Override 
    public int getItemCount() { 
     Log.d(TAG, "item count = " + Math.min(MAX_BADGES_TO_DISPLAY, badges.length)); 
     return Math.min(MAX_BADGES_TO_DISPLAY, badges.length); 
    } 

    public class BadgeBindingHolder extends RecyclerView.ViewHolder{ 
     private ViewDataBinding binding; 

     public BadgeBindingHolder(View rowView) { 
      super(rowView); 
      binding = DataBindingUtil.bind(rowView); 
     } 
     public ViewDataBinding getBinding() { 
      return binding; 
     } 
    } 
} 

profile_badge_row.xml. Neleri özledim?

=====================

Güncelleme: Ben RecyclerView Söyleyebileceğim kadarıyla

basitçe Bağlama bir Veri içinde çalışmaz düzeni. Sadece RV'imle ayrı bir düzen oluşturdum ve mükemmel bir şekilde çalıştı. Ana mizamı eklediğimde çalışmaya son verildi. Bu bir hata veya özellik olup olmadığından emin değil.

Yani, belki de özel bir görünüm yaparsam belki işe yarayacaktır diye düşündüm. Sorunum, özel görünümüme nasıl bir değer iletileceğini bilmiyorum.

here nolu telefonu inceledim ama ne demek istediğini tam olarak anlamadım. Bu, özel görünümdeki kodum.

LayoutInflater inflater = (LayoutInflater) 
      context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.profile_badges_layout, this, true); 
    ProfileBadgesLayoutBinding binding = ProfileBadgesLayoutBinding.inflate(inflater); 

    RecyclerView badgesRV = (RecyclerView) view.findViewById(R.id.badgesRV); 

    LinearLayoutManager llm = new LinearLayoutManager(context); 
    llm.setOrientation(LinearLayoutManager.HORIZONTAL); 
    badgesRV.setLayoutManager(llm); 

    BadgeAdapter badgeAdapter = new BadgeAdapter(null); 
    badgesRV.setAdapter(badgeAdapter); 

Bu, ProfileBadgesLayoutBinding öğesinin bulunmadığını bildiren bir ileti verir. Gelen

+0

sizin parçası xml yaklaşık bindToViewHolder

@Override public void bindToViewHolder(RecyclerView.ViewHolder viewHolder) { ProfileBadgeRowBinding binding = ((BadgeBindingHolder) viewHolder).binding; binding.setVariable(BR.badge, badge); binding.executePendingBindings(); binding.image.setImage(...); } 

Daha ?? –

+0

'RecyclerView',' DataBinding' ile mükemmel bir şekilde çalışır, çünkü diğerleri bunu sorunsuz olarak kullanır. Düzeninizi 'RecyclerView' konumunuzda yayınlayabilir misiniz? Belki diğer kaydırma görünümleri ile bazı garip davranış. – yennsarah

+1

Ayrıca, badge.badgeImage nedir? Bir 'Kaynak kimliği', 'Çizim' ..? – yennsarah

cevap

14

senin onCreateViewHolder:

@Override 
public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ProfileBadgeRowBinding binding = DataBindingUtil.inflate(inflater, R.layout.profile_badge_row, parent, false); 
    BadgeBindingHolder holder = new BadgeBindingHolder(binding.getRoot(), binding); 
    return holder; 
} 

Ve

public class BadgeBindingHolder extends RecyclerView.ViewHolder{ 
    private ProfileBadgeRowBinding binding; 

    public BadgeBindingHolder(View rowView, ProfileBadgeRowBinding binding) { 
     super(rowView); 
     this.binding = binding; 
    } 

    ... 

} 

Ve bindToViewHolder yılında

değişken

@Override 
public void bindToViewHolder(RecyclerView.ViewHolder viewHolder) { 
    ProfileBadgeRowBinding binding = ((BadgeBindingHolder) viewHolder).binding; 
    binding.setVariable(BR.badge, badge); 
    binding.executePendingBindings(); // This line is important, it will force to load the variable in a custom view 
} 

ayarlayın Öğe Görünümünde bağlayıcı eklemek Bir görünüme erişmek istiyorsanız, xml'unuzdaki bir görünüme bir kimlik ekleyin.

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <data> 
     <variable name="badge" type="parseJsonEntities.requestObjects.BadgeObject"/> 
    </data> 

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

     <ImageView 
      android:id="@+id/image" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

    </LinearLayout> 
</layout> 

Ve sonra sen kimliklerini erişebilir senin özel görünümler https://developer.android.com/topic/libraries/data-binding/index.html#dynamic_variables

+2

Teşekkürler! Sorunum, binding.executePendingBindings() işlevini kullanmadım. Bana bu kadar açık gözükmedi. Çok teşekkür ederim !!!! – Jack

+0

cankurtaran. +1 bu sadece benim için iyi çalıştı. – TharakaNirmana