2015-08-02 21 views
15

Tôi hiện đang có nhu cầu sử dụng RecyclerView (hoặc ListView) nhưng số lượng mục được cố định ở mức 4. Tôi muốn 4 mục đó sử dụng không gian có sẵn trên màn hình. RecyclerView là chế độ xem duy nhất trên màn hình ngoại trừ thanh ứng dụng. I E. RecyclerView có layout_height được đặt thành match_parent. Tôi đã chọn RecyclerView vì các mục có bố trí khác nhau tùy thuộc vào trạng thái mô hình.Làm cách nào tôi có thể sử dụng layout_weight trong chế độ xem RecyclerView hoặc ListView để có các mục có chiều cao bằng nhau lấp đầy không gian sẵn có trên màn hình?

Tôi chưa xem xét, nhưng tôi chắc chắn rằng tôi có thể đặt chiều cao theo lập trình trong mã Java cho từng mục. Nhưng điều đó có vẻ không phù hợp nếu tôi có thể chỉ định nó trong XML. Các câu hỏi tương tự ở bên phải của tôi, khi tôi viết câu hỏi này, hãy trả lời câu hỏi đó.

Tôi đã thử những điều sau đây trong file item_layout.xml, cách layout_weight được sử dụng trong các tình huống khác:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:layout_height="0dp">...</LinearLayout> 

Nhưng sau đó không có gì hiển thị trên màn hình.

Điều tôi muốn biết là, tôi có thể làm điều này trong XML bố cục với layout_weight hoặc cái gì khác không? Nếu vậy, làm thế nào?

+2

nếu số lượt xem là cố định. Tôi hoàn toàn không khuyến khích bạn sử dụng listview. chỉ cần đặt cho bố trí tuyến tính với trọng lượng bằng một. – hasan83

Trả lời

16

Khi API reference nói, layout_weight là một thuộc tính của LinearLayout, vì vậy nó không thể được sử dụng với ViewGroups khác như, ví dụ, RecyclerViewListView. Thay vào đó, bạn phải đặt chiều cao của mục theo lập trình.

Vì bạn có vẻ lo lắng về sự sạch sẽ của mã của bạn, tôi nghĩ rằng đây là một giải pháp khá thanh lịch trong trường hợp bạn sử dụng một RecyclerView:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater 
      .from(parent.getContext()) 
      .inflate(R.layout.item_list, null); 

    int height = parent.getMeasuredHeight()/4; 
    int width = parent.getMeasuredWidth(); 

    view.setLayoutParams(new RecyclerView.LayoutParams(width, height)); 

    return new ViewHolder(view); 
} 
+3

'parent.getMeasuredHeight()' trả về giá trị '0'! –

0

Tôi gặp sự cố này, vì tôi đã có RecyclerView với các mục nhập biến. RecyclerView ngang của tôi cần thiết để vừa với ít nhất ba chế độ xem mà không bị tràn, vì vậy tôi đã xây dựng các khung nhìn của mình để thay đổi kích cỡ khi chạy để phù hợp với màn hình.

class MyRecyclerView extends RecyclerView.Adapter<ViewHolder> { 

    int mViewWidth; 

    public MyRecyclerView(Context context) { 
     mViewWidth = defineViewWidth(context); 
    } 

    private int defineViewWidth(Context context) { 
     int definedWidth = (int) context.getResources().getDimension(R.dimen.default_view_width); 
     DisplayMetrics dm = new DisplayMetrics(); 
     WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     wm.getDefaultDisplay().getMetrics(dm); 
     if (definedWidth * 3 > dm.widthPixels) { 
     return dm.widthPixels/3; 
     } 
     return definedWidth; 
    } 

    ... 

} 

Một khi bạn có một chiều rộng định nghĩa, bạn cần phải thiết lập chiều rộng xem:

@Override 
public ViewHolder onCreateViewHolder(ViewHolder holder, int position) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); 
    ViewGroup.LayoutParams params = v.getLayoutParams(); 
    params.width = mViewWidth; 
    v.setLayoutParams(params); 
    return new ViewHolder(v); 
} 

Bạn có thể dễ dàng sửa đổi này để đảm bảo RecyclerView của bạn phù hợp như nhiều yếu tố (theo chiều dọc hoặc chiều ngang) như bạn nhu cầu.

5

Hãy thử điều này, làm việc cho tôi

int weight = 3; //number of parts in the recycler view. 

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent,false); 
     rowView.getLayoutParams().height = parent.getHeight()/weight; 
     return new ViewHolder(rowView); 
    } 
+0

bạn có lỗi cú pháp, nó phải là parent.getContext(), chỉnh sửa nó quá nhỏ để tôi thay đổi. –

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