2017-02-16 54 views
11

Vì vậy, tôi cần một RecyclerView nằm ngang. Tuy nhiên, các mục trong chúng có chiều cao động dựa trên những gì được trả về từ chương trình phụ trợ.RecyclerView ngang với các mục có chiều cao động

Các RecyclerView và các mặt hàng của mình có chiều cao của "wrap_content"

Vấn đề là nếu các mặt hàng có thể nhìn thấy đầu tiên trong RecyclerView là nhỏ, sau đó khi người dùng cuộn đến các mục lớn hơn, họ xuất hiện cắt đứt.

Lý tưởng nhất là chúng tôi muốn RecyclerView đủ lớn để chứa mục lớn nhất trong nhóm (nhưng chỉ có mục lớn nhất hiện có ... không phải là mặt hàng lớn nhất về mặt giả thuyết). RecyclerView tự động thay đổi chiều cao của nó cũng được chấp nhận.

Tôi đã viết một ứng dụng mẫu để minh họa sự cố. Trong ứng dụng này, chúng tôi có một danh sách nằm ngang. 33 mục đầu tiên sẽ hiển thị 1 dòng văn bản, trong khi mục tiếp theo sẽ hiển thị 3 dòng văn bản và 34 dòng cuối cùng sẽ hiển thị 2 dòng. Tuy nhiên, tất cả chúng đều hiển thị 1 dòng, vì chiều cao của RecyclerView không thay đổi.

Tôi đã thử gọi requestLayout() trên RecyclerView (và trên TextView) từ onBindViewHolder(), nhưng dường như không làm gì cả.

MainActivity:

public class MainActivity extends AppCompatActivity { 

    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mAdapter = createAdapter(); 

     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

    private RecyclerView.Adapter<ViewHolder> createAdapter() { 
     RecyclerView.Adapter adapter = new RecyclerView.Adapter<ViewHolder>() { 
      @Override 
      public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
       return new ViewHolder(v); 
      } 

      @Override 
      public void onBindViewHolder(ViewHolder holder, int position) { 
       if (position < 33) { 
        holder.mText.setText("1 line"); 
       } else if (position > 66) { 
        holder.mText.setText("2 lines\n2 lines"); 
       } else { 
        holder.mText.setText("3 lines\n3 lines\n3 lines"); 
       } 
      } 

      @Override 
      public int getItemCount() { 
       return 100; 
      } 
     }; 
     return adapter; 
    } 

    private static class ViewHolder extends RecyclerView.ViewHolder { 
     TextView mText; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      mText = (TextView) itemView.findViewById(R.id.text); 
     } 
    } 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</RelativeLayout> 

item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#888888"> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hi" 
     android:textSize="30sp" /> 

</LinearLayout> 
+0

Loại phiên bản recyclerView nào bạn có trên gradle? – Diekrul

+0

bằng cách sử dụng mới nhất 25.1.1 – Gak2

+1

@ Gak2 Tôi đã tự hỏi nếu bạn tìm thấy một giải pháp cho điều này bởi vì tôi đang đối mặt với cùng một vấn đề ngay bây giờ –

Trả lời

-2

Chỉ cần cal l itemAdapter.notifyDataSetChanged();

+0

Bạn có thể định dạng mã của mình bằng cách đánh dấu nó và nhấn Ctrl + K – WhatsThePoint

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