14

これはRecyclerViewでのデータバインディングでの最初の試みですが、RecyclerView自体の最初の使用ではありません。RecyclerViewとデータバインディングが機能しない

何らかの理由で、getItemCount()などのアダプタメソッドが呼び出されません。 私はRecyclerViewで愚かな問題になる可能性があり、データバインディングとはまったく関係がありませんが、間違って見えることはありません。

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

アダプタ:私はチェックして、そこにデータが間違いなく存在し

<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。 私は何を欠席しましたか?

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

アップデート:私はRecyclerViewを伝えることができるものから、

は、単にデータバインディング内では機能しません。レイアウト。 私は自分のRVだけで別のレイアウトを作成し、それは完全に機能しました。 メインレイアウトに含めたらすぐに機能しなくなりました。

これがバグか機能かわかりません。

私はそれをカスタムビューにすると、うまくいくかもしれないと思ったかもしれません。 私の問題は、カスタムビューに値を渡す方法がわかりません。

私はhereを見ましたが、彼が何を意味するのか正確には分かりませんでした。 これはカスタムビューのコードです。

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

これにより、ProfileBadgesLayoutBindingが見つからないというメッセージが表示されます。あなたのonCreateViewHolder

+0

あなたのフラグメントのXMLは約bindToViewHolder

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

もっと?? –

+0

'RecyclerView'は' DataBinding'と完全に連携します。他の多くの人が問題なく使っているからです。 'RecyclerView'が配置されているレイアウトを投稿できますか?たぶん、他のスクロールビューとの奇妙な動作。 – yennsarah

+1

また、 'badge.badgeImage'とは何ですか? 'リソースid'、' Drawable' ..? – yennsarah

答えて

14

@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; 
} 

そして、あなたのアイテムビュー

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

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

    ... 

} 

、変数

@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 
} 

を設定bindToViewHolder内にバインディングを追加ビューにアクセスする場合は、xmlのビューにIDを追加します。

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

そしてあなたがIDをアクセスすることができ、あなたのカスタムビューhttps://developer.android.com/topic/libraries/data-binding/index.html#dynamic_variables

+2

ありがとうございました!私の問題は、私はbinding.executePendingBindings()を使わなかったということでした。 それは私には明らかではありませんでした。 ありがとうございました!!!!救命救助者: – Jack

+0

+1これはちょうど私のためにうまくいった。 – TharakaNirmana

関連する問題