2015-08-25 13 views
7

Tôi đang sử dụng RecyclerView và tôi đang cố gắng để làm cho mục chiều rộng của RecyclerView match_parent kể từ khi tôi đang sử dụngRecyclerView rộng mục layout_width = “match_parent” không phù hợp với cha mẹ

LinearLayoutManager.HORIZONTAL

RecyclerView items after running

<android.support.v7.widget.RecyclerView 
      android:id="@+id/listOffersHits" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

custom_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_weight="1" 
    android:layout_margin="2dp" 
    card_view:cardCornerRadius="2dp"> 
    <ImageView 
     android:id="@+id/offerImage" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 

     android:background="@drawable/item_selector" 
     android:scaleType="fitXY" 
     android:src="@drawable/offer" 
     /> 

</android.support.v7.widget.CardView> 

LayoutManager

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false); 
    listOffersHits.setLayoutManager(linearLayoutManager); 

ViewHolder

View view= LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.custom_layout, parent, false); 
     ViewOffersHolder viewHolder=new ViewOffersHolder(view); 
     return viewHolder; 
+0

@Rami cảm ơn nhận xét của bạn, tôi đã thử cả hai giải pháp được đề xuất nhưng vẫn như cũ. Và tôi không nghĩ rằng vấn đề từ CardView bởi vì tôi đã thay đổi nó thành 'FrameLayout' và vẫn như cũ. – Diyaa

Trả lời

12

Tôi cố định vấn đề:

1- Lấy kích thước màn hình (chiều rộng).

2- làm cho chiều rộng ViewHolder giống như kích thước màn hình.

Dưới mã của tôi nếu có ai cần đến.

WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
     int width = windowManager.getDefaultDisplay().getWidth(); 
     int height = windowManager.getDefaultDisplay().getHeight(); 
     view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT)); 
+1

Nó hoạt động, nhưng hình ảnh không rõ ràng ... –

3

Di chuyển này trong layout.

android:layout_weight="1" 

Và đặt tham số bố cục cho mục trong bộ điều hợp một lần nữa.

View view= LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.custom_layout, parent, false); 
view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT)); 
ViewOffersHolder viewHolder=new ViewOffersHolder(view); 
return viewHolder; 
+1

Tôi đã làm điều đó nhưng không thay đổi. – Diyaa

6

Lưu ý: Xem cập nhật ở cuối bài đăng này.


Cũ Trả lời:

Sau đây làm việc cho tôi:

view.getLayoutParams().width = parentViewGroup.getWidth(); 

, ngay sau khi lạm phát quan điểm 'xem'.

Về cơ bản, nó lấy chiều rộng của bố mẹ và thay thế layout_width của chế độ xem mới với chiều rộng của cha mẹ.

Bạn cũng có thể thêm séc cho MATCH_PARENT, để đảm bảo nó xuất hiện chính xác trong trường hợp bạn sửa đổi XML thành một chiều rộng khác trong tương lai. Vì vậy, như thế này:

public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { 
     View vItem = LayoutInflater.from (parent.getContext()) 
          .inflate (R.layout.bookmark_card, parent, false); 
     if (vItem.getLayoutParams().width == RecyclerView.LayoutParams.MATCH_PARENT) 
      vItem.getLayoutParams().width = parent.getWidth(); 
     return new ViewHolder (vItem); 
    } 

Nó sẽ chỉ làm cho nó chiều rộng gốc nếu chiều rộng là MATCH_PARENT trước đó.

EDIT:

Do cẩn thận về việc sử dụng quá mức của sửa chữa này, như một biến thể của nó đã gây ra cho tôi một lỗi bố trí.Tôi đã làm điều này:

public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { 
     View vItem = LayoutInflater.from (parent.getContext()) 
          .inflate (R.layout.page_tile, parent, false); 
     if (vItem.getLayoutParams().width == RecyclerView.LayoutParams.MATCH_PARENT) 
      vItem.getLayoutParams().width = parent.getWidth(); 
     if (vItem.getLayoutParams().height == RecyclerView.LayoutParams.MATCH_PARENT) 
      vItem.getLayoutParams().height = parent.getHeight(); 
     return new ViewHolder (vItem); 
    } 

Điều đó đã hiệu quả nhưng không cập nhật chiều rộng và chiều cao khi RecyclerView được thay đổi kích thước. Do đó, một trong hai bản sửa lỗi cho bản sửa lỗi này có thể được áp dụng:

  1. Kiểm tra định hướng bộ điều hợp RecyclerView và chỉ thực hiện việc này.Cho phép, cho phép các kích thước mà cuộn được phép.
  2. Hoặc, ở đâu đó trong ViewHolder, lưu bản gốc 'chiều rộng' và 'chiều cao', và sau đó làm lại bước này mỗi lần trong phương thức onBindViewHolder().

Việc sửa chữa sau dường như làm việc:

public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { 
     View vItem = LayoutInflater.from (parent.getContext()) 
          .inflate (R.layout.page_tile, parent, false); 
     ViewHolder holder = new ViewHolder (vItem); // Create view holder. 
     holder.vItem = vItem; // Save top-level View. 
     holder.vParent = parent; // Save its parent. 
     ViewGroup.LayoutParams lp = vItem.getLayoutParams(); 
     if (lp != null) { // Save the original width and height from lp: 
      holder.originalWidth = lp.width; 
      holder.originalHeight = lp.height; 
      refreshLayoutParams (holder); // Check for MATCH_PARENT. 
     } else holder.originalHeight = holder.originalWidth = 0; 
     return holder; 
    } 
    public void onBindViewHolder (ViewHolder holder, int position) { 
     ... do work here ... 
     refreshLayoutParams (holder); // Check AGAIN for MATCH_PARENT. 
    } 
    private void refreshLayoutParams (ViewHolder holder) { 
     ViewGroup.LayoutParams lp = holder.vItem.getLayoutParams(); 
     View parent = holder.vParent; 
     if (parent == null) return; // Is there a parent to check against? 
     if (lp == null) 
      holder.vItem.setLayoutParams (lp = 
          new RecyclerView.LayoutParams (holder.originalWidth, holder.originalHeight)); 
     if (holder.originalWidth == RecyclerView.LayoutParams.MATCH_PARENT) 
      lp.width = parent.getWidth(); // Check width. 
     if (holder.originalHeight == RecyclerView.LayoutParams.MATCH_PARENT) 
      lp.height = parent.getHeight(); // Check height. 
    } 

Note Ngoài ra: Nếu bạn sử dụng phương pháp này thay đổi kích thước bên trong onBindViewHolder() phương pháp, bạn cũng sẽ cần phải getAdapter() .notifyDataSetChanged() bên trong Activity.onSizeChanged()!

Tóm lại, ý tưởng chính là: kiểm tra MATCH_PARENT trên mỗi liên kết, không chỉ trên trình tạo chế độ xem. Bằng cách này, thay đổi kích thước RecyclerView cũng hoạt động.


UPDATE: Tính đến RecyclerView v7: 23.2.1 ít nhất, có vẻ như họ đã cố định nó để mà bây giờ các bản sửa lỗi tùy chỉnh không còn cần thiết. RecyclerView chính nó bây giờ sẽ nhận ra cả hai thiết lập WRAP_CONTENT và MATCH_PARENT.

+0

Điều này làm việc tốt cho tôi. Tuy nhiên: thay vì sử dụng view.getLayoutParams(). Width = ..., tôi đã xem.setLayoutParams (new LinearLayout.LayoutParams (viewGroup.getWidth(), ViewGroup.LayoutParams.WRAP_CONTENT)); thay thế. Lý do là view.getLayoutParams có thể là null (trong trường hợp của tôi vì một lý do kì lạ nào đó). – Igor

+0

@Igor Cảm ơn bạn. Tôi đã tính đến điều này khi thực hiện chỉnh sửa ở trên. – RhetoricalRuvim

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