Как сделать вид сетки прокрутки по горизонтали, а не по вертикали в android?

У меня есть динамический вид сетки. Значит его содержание варьируется. Таким образом, если количество элементов увеличивается, он делает вертикальную прокрутку. Я хочу сделать это как горизонтальный свиток.

пожалуйста, предложите какое-то решение для этого.

5 ответов


вы можете попробовать положить GridView на HorizontalScrollView. Вы можете попытаться установить фиксированную высоту в GridView внутри HorizontalScrollView.

тогда вы можете динамически вычислить количество столбцов GridView на основе вашего контента и использования setNumColumns(int) метод для его установки.


        <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/seatLegendLayout">

        <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:id="@+id/linearLayout_gridtableLayout"
                android:layout_width="900dp"
                android:layout_height="match_parent"
                android:orientation="horizontal">

                <GridView
                    android:id="@+id/gridView1"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_margin="4dp"
                    android:columnWidth="100dp"
                    android:gravity="center"
                    android:numColumns="9"
                    android:horizontalSpacing="1dp"
                    android:scrollbarAlwaysDrawHorizontalTrack="true"
                    android:scrollbarAlwaysDrawVerticalTrack="true"
                    android:scrollbars="horizontal"
                    android:stretchMode="none"
                    android:verticalSpacing="1dp">

                </GridView>


            </LinearLayout>
        </FrameLayout>
    </HorizontalScrollView>

вы можете использовать стороннюю библиотеку двусторонний вид сетки. он отлично работает для горизонтальной прокрутки, или вы можете использовать RecyclerView


вы можете использовать мою логику для этого посмотрите на это:

https://stackoverflow.com/a/33339420/5479863


вот некоторое решение (Обновлено):

включите это в свою активность xml:

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="none"
    android:id="@+id/title_horizontalScrollView"
    android:layout_margin="1dp"
    android:fillViewport="false">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <GridView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/horizontal_gridView"
            android:layout_gravity="center"/>
    </LinearLayout>
</HorizontalScrollView>

создать пользовательский элемент сетки в папке макета:

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

<TextView
    android:id="@+id/grid_item"
    android:layout_width="120dp"
    android:layout_height="30dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:gravity="center"
    android:text="here is the text"
    android:textAlignment="center"
    android:textSize="15sp"
    android:textStyle="bold" />
</RelativeLayout>

чем вам нужно настроить его из кода (потому что это лучший способ для этого) а также почувствуйте это с адаптером:

public class MainActivity extends AppCompatActivity {

public GridView gridView;

String[] models = {"Some text here", "and here" ,"and also here","one here","hello","here too"," and here"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    gridView = (GridView)findViewById(R.id.horizontal_gridView);
    gridViewSetting();
}


private void gridViewSetting() {

    // this is size of your list with data
    int size = models.length;
    // Calculated single Item Layout Width for each grid element .. for me it was ~100dp
    int width = 100 ;

    // than just calculate sizes for layout params and use it
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics(dm);
    float density = dm.density;

    int totalWidth = (int) (width * size * density);
    int singleItemWidth = (int) (width * density);

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            totalWidth, LinearLayout.LayoutParams.MATCH_PARENT);

    gridView.setLayoutParams(params);
    gridView.setColumnWidth(singleItemWidth);
    gridView.setHorizontalSpacing(2);
    gridView.setStretchMode(GridView.STRETCH_SPACING);
    gridView.setNumColumns(size);
    GridAdapter adapter = new GridAdapter(MainActivity.this, models);
    gridView.setAdapter(adapter);

} }

Это пример пользовательского адаптера:

public class GridAdapter extends BaseAdapter {

private String[] modelsName;

private Context context;

private LayoutInflater inflater;

public GridAdapter(Context con, String[] names) {
    this.modelsName = names;
    this.context = con;
}

@Override
public int getCount() {
    return modelsName.length;
}

@Override
public Object getItem(int i) {
    return modelsName[i];
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    View gridView = view;

    if(view == null) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        gridView = inflater.inflate(R.layout.custom_layout, null);
    }

    TextView text = (TextView) gridView.findViewById(R.id.grid_item);

    text.setText(modelsName[i]);

    return gridView;
} }

Я взял это решение из здесь.