web-dev-qa-db-fra.com

GridLayoutManager - la largeur de colonne enveloppe son propre plus grand enfant

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:

enter image description here

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.

enter image description here

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 !

12
MHogge

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));
8
Suresh Kumar