J'ai un RecyclerView
dans un HorizontalScrollView
et je veux qu'il utilise un GridLayoutManager
. C'est ok mais une chose me dérange toujours, la largeur de chaque colonne est la même (basée sur la plus grande largeur de cellule je suppose?). N'est-il pas possible d'encapsuler la largeur des colonnes pour correspondre à la plus grande cellule de cette colonne spécifique?
Il devrait ressembler à quelque chose comme ceci:
Où la partie orange est la partie prise par la vue de la cellule.
[~ # ~] modifier [~ # ~]
On m'a demandé de clarifier ce que j'attends. Un exemple vaut mieux que des mots, ici vous pouvez voir une capture d'écran d'un RecyclerView avec GridLayoutManager. Chaque élément est un simple TextView contenant au hasard un texte entre 10 et 40 caractères. Le RecyclerView est à l'intérieur d'un HorizontalScrollView comme indiqué précédemment. Nous pouvons voir que toutes les colonnes ont la même largeur, malgré le fait qu'aucun élément de cette colonne ne puisse remplir toute la largeur. Ce que je voudrais, c'est supprimer ces espaces vides inutiles et avoir des colonnes de tailles différentes, chaque colonne correspondant à la largeur de son propre plus grand enfant.
Si vous souhaitez tester ce comportement, vous pouvez cloner ce dépôt que j'ai téléchargé sur Github: https://github.com/ShargotthDev/TestGrid
Comme demandé, voici ma disposition XML (très basique):
<?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>
EDIT 2
J'aurais dû mentionner que certaines cellules peuvent avoir une taille d'envergure> 1 et le LayoutManager doit être vertical pour que ces cellules prennent plus de place horizontalement et non verticalement (je ne sais pas si je me rends compréhensible).
Merci pour votre temps !
Vous n'avez pas besoin de placer votre RecyclerView dans HorizontalScrollView. Voir le code ci-dessous.
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);
}
}
Classe d'adaptateur
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>
Modifier Placez votre RecyclerView dans NestedScrollView comme ceci
<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>
et définissez votre nombre de spanCount comme ceci
spanCount = 8;
grid.setLayoutManager(new GridLayoutManager(this, spanCount, LinearLayoutManager.HORIZONTAL, false));