14

Đây là nỗ lực đầu tiên của tôi trong việc liên kết dữ liệu với RecyclerView nhưng không phải là lần đầu tiên tôi sử dụng RecyclerView.RecyclerView và Data Binding không hoạt động

Vì một lý do nào đó, không có phương thức bộ điều hợp nào được gọi - thậm chí không getItemCount(). Nó có thể là một vấn đề ngu ngốc với RecyclerView của tôi và không có gì để làm với các ràng buộc dữ liệu ở tất cả, nhưng tôi không thể nhìn thấy bất cứ điều gì sai.

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

Adaptor:

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

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

Tôi đã kiểm tra và có chắc chắn là dữ liệu đó. Tôi đã bỏ lỡ điều gì?

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

Cập nhật:

Từ những gì tôi có thể nói RecyclerView chỉ đơn giản là không làm việc bên trong một Binding dữ liệu bố trí. Tôi đã tạo bố cục riêng chỉ với RV của tôi và nó hoạt động hoàn hảo. Ngay sau khi tôi bao gồm nó với bố cục chính của tôi nó ngừng hoạt động.

Không chắc chắn đây có phải là lỗi hay tính năng hay không.

Vì vậy, tôi nghĩ rằng có lẽ nếu tôi làm cho nó một cái nhìn tùy chỉnh có thể nó sẽ làm việc và nó. Vấn đề của tôi là tôi không biết cách chuyển giá trị vào chế độ xem tùy chỉnh của mình.

Tôi đã xem here nhưng không thể hiểu chính xác ý của mình. Đây là mã của tôi trong chế độ xem tùy chỉnh.

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

Điều này cho biết thông báo rằng ProfileBadgesLayoutBinding không được tìm thấy.

+0

nơi là xml mảnh của bạn của bạn ?? –

+0

'RecyclerView' hoạt động hoàn hảo với' DataBinding', vì nhiều người khác đang sử dụng nó mà không có vấn đề gì. Bạn có thể đăng bố trí của bạn nơi 'RecyclerView' của bạn được đặt? Có thể một số hành vi kỳ lạ với các chế độ xem cuộn khác. – yennsarah

+1

Ngoài ra, 'badge.badgeImage' là gì? Một 'Resource id', một' Drawable' ..? – yennsarah

Trả lời

14

Trong bạn 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; 
} 

Và thêm các ràng buộc trong Item Xem

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

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

    ... 

} 

Và trong bindToViewHolder đặt biến

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

Nếu bạn muốn truy cập chế độ xem, hãy thêm id vào chế độ xem trong số xml của bạn.

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

Và sau đó bạn có thể truy cập của id trong bindToViewHolder

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

    binding.image.setImage(...); 
} 

Thông tin thêm về quan điểm tùy chỉnh https://developer.android.com/topic/libraries/data-binding/index.html#dynamic_variables

+2

Cảm ơn bạn! Vấn đề của tôi là tôi đã không sử dụng binding.executePendingBindings(); Nó trông không rõ ràng đối với tôi. Cảm ơn bạn rất nhiều !!!! – Jack

+0

phao cứu sinh. +1 điều này chỉ làm việc tốt cho tôi. – TharakaNirmana

Các vấn đề liên quan