2015-08-14 16 views
9

Cho đến bây giờ tôi đã sử dụng Bộ điều hợp onBindViewHolder để đặt nền xoay chiều dựa trên Bộ điều hợp vị trí của vật phẩm.Cách liên tục thêm các hình nền xen kẽ vào các giao diện mục trong RecyclerView

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    holder.itemView.setBackgroundResource(position % 2 == 0 ? 
      R.color.list_item_background_alternating : R.color.list_item_background); 
    ... 
} 

Tuy nhiên, điều này trở nên phức tạp hơn khi làm nhiều hơn là chỉ hiển thị danh sách. Ví dụ: Khi tôi xóa một mục và gọi notifyItemRemoved(index);RecyclerView có hoạt ảnh đẹp và chế độ xem mục đã biến mất. Tuy nhiên, chế độ xem thay thế hình ảnh đã xóa không bị ràng buộc lại (vì rõ ràng là & lý do chính đáng) và do đó giữ nguyên nền cũ. Điều này dẫn đến sự mâu thuẫn với bố cục và trông xấu xí. Khi tôi gọi notifyDataSetChanged(); hình nền đều chính xác, nhưng tôi bị mất hoạt ảnh.

Tôi gặp sự cố tương tự khi sử dụng SortedList (với số SortedListAdapterCallback). Vì việc sắp xếp dường như diễn ra sau khi các khung nhìn bị ràng buộc, các hình nền sẽ bị vỡ.

Điều gì sẽ là cách phù hợp/nhất quán để thực hiện hành vi như vậy?

Trả lời

10

Được rồi, trong khi tôi đang viết câu hỏi của mình, tôi muốn thử một thứ mà tôi nghĩ sẽ không hoạt động - tuy nhiên, nó đã làm.

Tôi tạo ra một ItemDecoration và sử dụng nó getItemOffset(); để thiết lập nền của xem:

public class BackgroundItemDecoration extends RecyclerView.ItemDecoration { 

    private final int mOddBackground; 
    private final int mEvenBackground; 

    public BackgroundItemDecoration(@DrawableRes int oddBackground, @DrawableRes int evenBackground) { 
     mOddBackground = oddBackground; 
     mEvenBackground = evenBackground; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     super.getItemOffsets(outRect, view, parent, state); 
     int position = parent.getChildAdapterPosition(view); 
     view.setBackgroundResource(position % 2 == 0 ? mEvenBackground : mOddBackground); 
    } 
} 

tôi cảm thấy một chút tội lỗi mặc dù, rằng tôi là con heo đất-đóng bao trên getItemOffsets().

Có ai có giải pháp sạch hơn/tốt hơn không?

+1

Ý của bạn là gì? Tôi không đăng lại. Tôi vừa trả lời câu hỏi của chính mình. Điều đó thậm chí không được khuyến khích sao? Khi viết một câu hỏi, bạn có tùy chọn để cung cấp câu trả lời cho câu hỏi đó. Vui lòng làm rõ lý do tại sao điều đó xấu. – robocab

2

Đây là giải pháp của tôi MụcView đề cập đến Chế độ xem từ trình tạo bố cục trong tệp onCreateViewHolder.

public void onBindViewHolder(MyViewHolder holder, int position){ 
    //alternate row color 
      if(position % 2==0) 
       holder.itemView.setBackgroundColor(Color.YELLOW); 
      else 
       holder.itemView.setBackgroundColor(Color.LTGRAY); 
) 

Đó là tất cả những gì bạn cần. Hi vọng điêu nay co ich.

+1

Đó là những gì tôi đã đề cập trong câu hỏi của tôi. Điều đó không giúp tách View-Binding khỏi View-Decoration. – robocab

-1

lưu ý: - mã này sẽ hoạt động trên Lollipop và được kiểm tra ở trên. và cũng điền vào các nhà xây dựng của bạn có được bối cảnh không phải là null nếu nó là null sau đó nó không phải là công việc.

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

     LocationModel locationModel = locationModelArrayList.get(position); 

     if(position%2==0) 
     { 

      holder.itemView.setBackgroundColor(ContextCompat.getColor(context,R.color.colorPrimary)); 
     }else 
     { 
      holder.itemView.setBackgroundColor(ContextCompat.getColor(context,R.color.colorPrimaryDark)); 

     } 

    } 
+0

Tương tự như câu trả lời khác và thực sự là cùng một logic tôi đã cung cấp trong câu hỏi ban đầu của mình. – robocab

+0

nếu bạn muốn để có được hình ảnh động của bạn cũng đặt nó bên trong onBindviewHolder dữ liệu thiết lập cây quan sát để sử dụng xem của bạn là lựa chọn tốt nhất để mointor recyclerview của bạn. hoặc tùy chọn thứ hai là hoạt ảnh của bạn bắt đầu và dừng hoạt động không có ở đây. khi bao giờ mục của bạn được thông báo để thay đổi hàng phân biệt đó không chỉ toàn bộ quảng cáo –

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