9

HorizontalScrollView içinde bir RecyclerView var ve bir GridLayoutManager kullanmak istiyorum. Bu tamam ama bir şey hala beni rahatsız, her sütunların genişliği aynı mı (varsayalım en büyük hücre genişliğine göre?). Bu özel sütunun en büyük hücresiyle eşleştirmek için sütunların genişliğini sarmak mümkün değil mi?GridLayoutManager - sütun genişliği kendi en büyük çocuğunu sardı

Böyle bir şey için görünmelidir: turuncu kısmı hücrenin bakış tarafından alınan parçasıdır

enter image description here

.


DÜZENLEME Biz ne bekliyoruz netleştirmek istedi. Bir örnek kelimelerden daha iyidir, burada GridLayoutManager ile bir RecyclerView ekran görüntüsünü görebilirsiniz. Her öğe, 10 & 40 karakter arasında rastgele bir metin içeren basit bir TextView'dir. RecyclerView, daha önce de belirtildiği gibi bir HorizontalScrollView içinde. Bu sütundaki hiçbir öğenin tüm genişliği karşılayamasa bile her sütunun aynı genişliğe sahip olduğunu görebiliriz. İstediğim şey, boş olan bu boş alanı kaldırmak ve her bir sütunun kendi en büyük çocuğunun genişliğine uyan farklı boyutlarda sütunlara sahip olmaktır.

enter image description here

bu davranışı test etmek istiyorsanız, ben Github yüklenen bu repo klonu olabilir:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <HorizontalScrollView 
     android:id="@+id/gameplay_hotizontalScroll_ScrollView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="70dp"> 

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

    </HorizontalScrollView> 

</RelativeLayout> 
: https://github.com/ShargotthDev/TestGrid sorulan gibi

, burada XML düzeni (çok temel) 'dir


DÜZENLEME 2

Ben hücrelerden bazılarını bir açıklık boyutuna> 1 olabilir ve bu hücreler (Kendimi anlaşılabilir yapıyorum eğer bilmiyorum) dikey yatay ve fazla yer almak böylece LayoutManager dikey olması gerektiğini bahsetmeliydik.

Zaman ayırdığınız için teşekkür ederiz!

+0

Hala tam olarak ne istediğinizi anlamıyorum? –

+0

xml düzeninizi gönderebilir misiniz? "ColumnSpan" ve "columnWeight" kullandınız mı? –

+0

@aratikyada Bu davranışı çoğaltmak için klonlayabileceğim ve belki de ne demek istediğimi daha iyi anlayabileceğiniz bir açıklama ve repo koydum. – MHogge

cevap

6

Sen HorizontalScrollView daki RecyclerView koymak gerekmez. Aşağıdaki kodlara bakın.

public class MainActivity extends AppCompatActivity { 

    String[] list = new String[]{"Some text goes here", "Some small", "text", "goes here", "Some", "very large text", "goes here", 
      "Some text goes here", "Some small", "text", "goes here", "Some", "very large text", "goes here"}; 
    RecyclerView grid; 
    GridAdapter adapter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     grid = (RecyclerView)findViewById(R.id.grid); 
     grid.setLayoutManager(new GridLayoutManager(this, 2, LinearLayoutManager.HORIZONTAL, false)); 
     grid.setHasFixedSize(true); 
     adapter = new GridAdapter(list); 
     grid.setAdapter(adapter); 
    } 
} 

Adaptör sınıfı

public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder>{ 
    String[] mList; 
    public GridAdapter(String[] list) { 
     mList = list; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.bind(mList[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return mList.length; 
    } 

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

     public void bind(String s) { 
      textView.setText(s); 
     } 
    } 
} 

row.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="match_parent" 
    android:padding="10dp"> 
    <TextView android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    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" 
    tools:context="cab.suresh.gridlayoutexample.MainActivity"> 

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

Düzenleme bu

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="none"> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/grid" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
</android.support.v4.widget.NestedScrollView> 

gibi NestedScrollView içerdeki RecyclerView koyun ve bunun gibi spanCount sayınızı set

spanCount = 8;

grid.setLayoutManager(new GridLayoutManager(this, spanCount, LinearLayoutManager.HORIZONTAL, false)); 
+0

Sorununuzu çözerse bu cevabı kabul edin. –

+0

Bu gerçekten çok hoş ve aslında soruya cevap veriyor. Ama daha da kesinleşmiş olmalıyım, bu RecyclerView/ScrollView kombinasyonu ile oluşturduğum 2D tablosu spanSize> 1 olan hücrelere sahip olabilir ancak çözümünüz LayoutManager'ın Yatay olarak ayarlanmış olması gerektiğinden, spanSize> 1 olan bir hücre değil Dikey LayoutManager ile bak. (Ayrıca veri kümemin oluşturulma şeklini yeniden düzenlemem gerekecek, fakat bu imkansız değil). PS: Sorunumu gerçekten çözerse bir cevabı kabul etmeden geri dönmeyeceğim, endişelenme. – MHogge

+0

Ve herhangi bir çözüm bulamazsam, başlangıçta açıklanan sorunu çözdüğünüz için sizinkileri kabul ediyorum. – MHogge