import android.os.Bundle
import androidx.leanback.app.VerticalGridSupportFragment
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.FocusHighlight
import androidx.leanback.widget.HeaderItem
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.ListRowPresenter
import androidx.leanback.widget.VerticalGridPresenter
class GridFragment : VerticalGridSupportFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = getString(R.string.grid_title)
setupFragment()
}
private fun setupFragment() {
val rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
val oneHeader = HeaderItem("app1")
val gridPresenter = MyGridPresenter(ZOOM_FACTOR, true)
gridPresenter.numberOfColumns = COLUMNS
setGridPresenter(gridPresenter)
val gridRowAdapter = ArrayObjectAdapter(gridPresenter)
/* gridRowAdapter.add("ITEM 1")
gridRowAdapter.add("ITEM 2")
gridRowAdapter.add("ITEM 3")
gridRowAdapter.add("ITEM 4") */
/* for (i in 0..4) {
val movie = Movie()
movie.title = "title$i"
movie.studio = "studio$i"
gridRowAdapter.add(movie)
} */
rowsAdapter.add(ListRow(oneHeader, gridRowAdapter))
adapter = rowsAdapter
}
private inner class MyGridPresenter(
focusZoomFactor: Int,
useFocusDimmer: Boolean
) : VerticalGridPresenter(focusZoomFactor, useFocusDimmer) {
override fun initializeGridViewHolder(vh: ViewHolder) {
super.initializeGridViewHolder(vh)
val gridView = vh.gridView
val top = 20
val bottom = gridView.paddingBottom
val right = gridView.paddingRight
val left = gridView.paddingLeft
/* gridView.layoutParams = ViewGroup.LayoutParams(
GRID_WIDTH, GRID_HEIGHT
) */
gridView.isFocusable = true
gridView.isFocusableInTouchMode = true
gridView.setPadding(left, top, right, bottom)
gridView.verticalSpacing = 50
gridView.horizontalSpacing = 50
}
}
companion object {
private const val COLUMNS = 4
private const val ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_MEDIUM
private const val GRID_WIDTH = 300
private const val GRID_HEIGHT = 200
}
}
import android.os.Bundle
import androidx.leanback.app.VerticalGridSupportFragment
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.FocusHighlight
import androidx.leanback.widget.VerticalGridPresenter
class GridFragment : VerticalGridSupportFragment() {
private val mAdapter: ArrayObjectAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = getString(R.string.grid_title)
rowAdapter()
}
private fun rowAdapter() {
val gridPresenter = MyGridPresenter(ZOOM_FACTOR, true)
gridPresenter.numberOfColumns = COLUMNS
setGridPresenter(gridPresenter)
val themeResId = R.style.Theme_AndroidTv
}
internal class MyGridPresenter(
focusZoomFactor: Int,
useFocusDimmer: Boolean
) : VerticalGridPresenter(focusZoomFactor, useFocusDimmer) {
override fun initializeGridViewHolder(vh: ViewHolder) {
super.initializeGridViewHolder(vh)
val gridView = vh.gridView
val top = 20
val bottom = gridView.paddingBottom
val right = gridView.paddingRight
val left = gridView.paddingLeft
gridView.setPadding(left, top, right, bottom)
gridView.verticalSpacing = 50
gridView.horizontalSpacing = 50
}
}
companion object {
private const val COLUMNS = 4
private const val ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_MEDIUM
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.MainActivity">
</FrameLayout>
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import com.example.griatest.R
class MainActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.main_fragment, GridFragment())
.commit()
}
}
}
import java.io.Serializable
data class Movie(
var id: Long = 0,
var title: String? = null,
var studio: String? = null,
var cardImageUri: String? = null
) : Serializable {
override fun toString(): String {
return "Movie{ id=$id, title=$title\n, cardImageUrl=$cardImageUri\n"
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.leanback.app.BrowseSupportFragment
import androidx.leanback.widget.ArrayObjectAdapter
import androidx.leanback.widget.HeaderItem
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.ListRowPresenter
import androidx.leanback.widget.Presenter
class MainFragment :BrowseSupportFragment () {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupUIElements()
loadRows()
}
private fun loadRows() {
val rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
// 添加ITEM
val oneHeader = HeaderItem(0, "oneItemHeader")
val mGridPresenter = GridItemPresenter()
val gridRowsAdapter = ArrayObjectAdapter(mGridPresenter)
gridRowsAdapter.add("ITEM 1")
gridRowsAdapter.add("ITEM 2")
gridRowsAdapter.add("ITEM 3")
gridRowsAdapter.add("ITEM 4")
// 添加
val cardHeader = HeaderItem(1, "cardHeader")
val cardPresenter = CardPresenter()
val cardRowAdapter = ArrayObjectAdapter(cardPresenter)
for (i in 0..4) {
val movie = Movie()
movie.title = "title$i"
movie.studio = "studio$i"
cardRowAdapter.add(movie)
}
rowsAdapter.add(ListRow(cardHeader, cardRowAdapter))
rowsAdapter.add(ListRow(oneHeader, gridRowsAdapter))
adapter = rowsAdapter
}
private fun setupUIElements() {
// 标题栏
title = "hello android"
// ENABLED 显示左侧导航栏,DISABLED 不显示 HIDDEN 隐藏,到边缘按左键还能显示
headersState = HEADERS_ENABLED
isHeadersTransitionOnBackEnabled = true
// 左侧导航背景色
brandColor = ContextCompat.getColor(
requireContext(), R.color.fastlane_background
)
// 搜索颜色
searchAffordanceColor = ContextCompat.getColor(
requireContext(), R.color.selected_background
)
}
override fun onDestroy() {
super.onDestroy()
}
private inner class GridItemPresenter : Presenter() {
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
val view = TextView(parent.context)
view.layoutParams = ViewGroup.LayoutParams(
GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT
)
view.isFocusable = true
view.isFocusableInTouchMode = true
view.setBackgroundColor(
ContextCompat.getColor(
context!!, R.color.default_background
)
) // 背景颜色
view.setTextColor(Color.WHITE) // 文字颜色
view.gravity = Gravity.CENTER // 居中
return ViewHolder(view)
}
override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
(viewHolder.view as TextView).text = item as String
}
override fun onUnbindViewHolder(viewHolder: ViewHolder?) {}
}
companion object {
private const val GRID_ITEM_WIDTH = 300
private const val GRID_ITEM_HEIGHT = 200
}
}
import android.graphics.drawable.Drawable
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.leanback.widget.ImageCardView
import androidx.leanback.widget.Presenter
import kotlin.properties.Delegates
class CardPresenter : Presenter() {
private var mDefaultCardImage: Drawable? = null
private var sSelectedBackgroundColor: Int by Delegates.notNull()
private var sDefaultBackgroundColor: Int by Delegates.notNull()
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
sDefaultBackgroundColor = ContextCompat.getColor(
parent.context, R.color.default_background
)
// 移动到item时显示的背景颜色
sSelectedBackgroundColor = ContextCompat.getColor(
parent.context, R.color.selected_background
)
// item背景图片
mDefaultCardImage = ContextCompat.getDrawable(
parent.context, R.drawable.movie
)
val cardView = object : ImageCardView(parent.context) {
override fun setSelected(selected: Boolean) {
updateCardBackgroundColor(this, selected)
super.setSelected(selected)
}
}
cardView.isFocusable = true
cardView.isFocusableInTouchMode = true
updateCardBackgroundColor(cardView, false)
return ViewHolder(cardView)
}
override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
val movie = item as Movie
val cardView = viewHolder.view as ImageCardView
// 直接设置卡片图片,与mainImageView有什么区别?,如何设置间距?
cardView.titleText = movie.title // 卡片标题
cardView.contentText = movie.studio // 文本内容
cardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT) // 卡片大小
cardView.mainImage = mDefaultCardImage
}
override fun onUnbindViewHolder(viewHolder: ViewHolder) {
val cardView = viewHolder.view as ImageCardView
cardView.badgeImage = null
cardView.mainImage = null
}
private fun updateCardBackgroundColor(view: ImageCardView, selected: Boolean) {
val color = if (selected) sSelectedBackgroundColor else sDefaultBackgroundColor
view.setBackgroundColor(color)
view.setInfoAreaBackgroundColor(color)
}
companion object {
private const val TAG = "CardPresenter"
// 背景尺寸大小
private const val CARD_WIDTH = 313
private const val CARD_HEIGHT = 176
}
}
就是常规的Fragment用法啊
VerticalGridSupportFragment使用方法
引用c知道,可以参考下
VerticalGridSupportFragment是Android Leanback库中的一个类,用于在垂直网格布局中显示内容。要使用VerticalGridSupportFragment,需要按照以下步骤进行操作:
1在布局文件中添加VerticalGridSupportFragment的容器:
<FrameLayout
android:id="@+id/vertical_grid_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2在Activity或Fragment中,使用FragmentManager将VerticalGridSupportFragment添加到容器中:
VerticalGridSupportFragment verticalGridSupportFragment = new VerticalGridSupportFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.vertical_grid_container, verticalGridSupportFragment)
.commit();
3创建VerticalGridPresenter对象,并设置到VerticalGridSupportFragment中:
ArrayObjectAdapter adapter = new ArrayObjectAdapter(myCardPresenter);
verticalGridSupportFragment.setAdapter(adapter);
4创建一个数据集,例如ArrayObjectAdapter,并将数据添加到适配器中:
ArrayObjectAdapter adapter = new ArrayObjectAdapter(myCardPresenter);
// 添加数据到适配器中
adapter.add(card1);
adapter.add(card2);
// ...
// 将适配器设置给VerticalGridSupportFragment
verticalGridSupportFragment.setAdapter(adapter);
其中,myCardPresenter是CardPresenter的实例,用于定义卡片的外观和布局。
(可选)自定义垂直网格布局的行和列的数量:
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, NUM_COLUMNS);
verticalGridSupportFragment.setLayoutManager(gridLayoutManager);
其中,NUM_COLUMNS是要显示的列数。
这样,你就可以使用VerticalGridSupportFragment来显示垂直网格布局了。
https://blog.csdn.net/qq_33430222/article/details/105094240
https://s7si.ldaichat.com/c.html
可以问下chatgpt ,按照自己的理解问答。
如果想在网格区域中加载卡片,需要自定义适配器并继承自 VerticalGridPresenter。在适配器中,实现 onBindViewHolder() 方法来设置卡片视图
首先,在你的项目中添加Leanback库的依赖。在你的app模块的build.gradle文件中,添加以下依赖项:
implementation 'androidx.leanback:leanback:1.1.0'
在你的布局文件中,添加一个VerticalGridSupportFragment的占位符。例如,在你的activity_main.xml文件中:
<fragment
android:id="@+id/vertical_grid_fragment"
android:name="androidx.leanback.app.VerticalGridSupportFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在你的活动中,使用FragmentManager获取对VerticalGridSupportFragment的引用,并设置相关的属性和适配器。例如:
VerticalGridSupportFragment fragment = (VerticalGridSupportFragment) getSupportFragmentManager()
.findFragmentById(R.id.vertical_grid_fragment);
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new MyCardPresenter()); // 自定义CardPresenter
fragment.setAdapter(adapter);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, NUM_COLUMNS);
fragment.getVerticalGridView().setLayoutManager(gridLayoutManager);
创建适配器。适配器用于提供数据并将其绑定到VerticalGridSupportFragment的视图上。你可以自定义适配器以适应你的数据模型和布局需求。
public class MyCardPresenter extends Presenter {
// 实现适配器方法
}
每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。
1、添加 Leanback Support Library 的依赖
implementation 'androidx.leanback:leanback:1.1.0'
2、创建一个继承自 VerticalGridSupportFragment 的片段类,并实现必要的方法
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.leanback.app.VerticalGridSupportFragment;
import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.leanback.widget.Presenter;
import androidx.leanback.widget.VerticalGridPresenter;
public class MyVerticalGridFragment extends VerticalGridSupportFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupFragment();
}
private void setupFragment() {
// 创建一个垂直网格布局的 Presenter
VerticalGridPresenter presenter = new VerticalGridPresenter();
presenter.setNumberOfColumns(4); // 设置每行显示的列数
// 创建一个适配器,并添加数据项
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new MyPresenter());
adapter.add("Item 1");
adapter.add("Item 2");
adapter.add("Item 3");
// 将适配器设置给片段
setAdapter(adapter);
// 设置片段的布局管理器和 Presenter
setGridPresenter(presenter);
}
// 自定义 Presenter 类,用于展示数据项
private static class MyPresenter extends Presenter {
// 实现必要的方法,比如创建视图和绑定数据等
}
}
3、使用该片段
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建并添加 VerticalGridSupportFragment
MyVerticalGridFragment fragment = new MyVerticalGridFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}
4、添加一个容器来放置片段
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
创建一个继承自VerticalGridSupportFragment的子类。
在子类中实现必要的方法,例如onCreateView()和onActivityCreated()。
在onActivityCreated()方法中,设置VerticalGridPresenter和VerticalGridPresenter类的相关属性,例如列数、卡片间距等。
创建一个适配器类来提供数据给VerticalGridSupportFragment。
在子类中设置适配器给VerticalGridSupportFragment。
在您的Activity或Fragment中使用FragmentManager将VerticalGridSupportFragment添加到布局中。
VerticalGridSupportFragment是Android Leanback库中的一个Fragment,用于显示一个垂直网格列表。它可以方便地与其他Leanback库组件如RowsSupportFragment和DetailsSupportFragment集成,以创建实现类似于电视用户界面的应用程序。
使用VerticalGridSupportFragment,首先需要引入Leanback库的依赖,并在布局文件中添加VerticalGridView。例如,可以使用以下代码在XML布局文件中添加VerticalGridView:
<android.support.v17.leanback.widget.VerticalGridView
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然后,在Activity或Fragment中,可以创建一个VerticalGridPresenter对象,该对象用于设置网格列表的外观和行为。例如,可以使用以下代码创建一个默认的VerticalGridPresenter:
VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
接下来,可以创建VerticalGridSupportFragment,并将其附加到Activity或Fragment中的VerticalGridView上。此外,还需要将Adapter设置为网格列表的数据源。
VerticalGridSupportFragment gridFragment = new VerticalGridSupportFragment();
gridFragment.setPresenter(gridPresenter);
gridFragment.setAdapter(adapter);
getSupportFragmentManager().beginTransaction().replace(R.id.container, gridFragment).commit();
在这里,adapter是一个继承自ObjectAdapter的数据源对象。例如,可以使用ArrayObjectAdapter来创建一个简单的数据源:
ArrayObjectAdapter adapter = new ArrayObjectAdapter(new MyPresenterSelector());
adapter.add("Item 1");
adapter.add("Item 2");
adapter.add("Item 3");
在这里,MyPresenterSelector是一个继承自PresenterSelector的对象,用于选择在网格列表中显示的每个项目的Presenter对象。例如,如果要显示文字列表,可以使用以下Presenter:
class TextPresenter extends Presenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
TextView view = new TextView(parent.getContext());
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item) {
TextView view = (TextView) viewHolder.view;
view.setText((String) item);
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
// Do nothing.
}
}
class MyPresenterSelector extends PresenterSelector {
@Override
public Presenter getPresenter(Object item) {
return new TextPresenter();
}
}
在这里,TextPresenter是一个继承自Presenter的对象,用于显示每个项目的布局和外观。
最后,可以在Adapter中添加更复杂的数据,例如电影或电视节目。在这种情况下,还需要创建一个相关的Presenter对象和Layout文件。
class Movie {
private String title;
private String imageUrl;
public Movie(String title, String imageUrl) {
this.title = title;
this.imageUrl = imageUrl;
}
public String getTitle() {
return title;
}
public String getImageUrl() {
return imageUrl;
}
}
class MoviePresenter extends Presenter {
private static final int CARD_WIDTH = 313;
private static final int CARD_HEIGHT = 176;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_card, parent, false);
view.setFocusable(true);
view.setFocusableInTouchMode(true);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item) {
Movie movie = (Movie) item;
ImageView imageView = (ImageView) viewHolder.view.findViewById(R.id.image);
imageView.setImageResource(R.drawable.default_image);
new DownloadImageTask(imageView).execute(movie.getImageUrl());
TextView textView = (TextView) viewHolder.view.findViewById(R.id.title);
textView.setText(movie.getTitle());
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
// Do nothing.
}
static class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewRef;
public DownloadImageTask(ImageView imageView) {
imageViewRef = new WeakReference<>(imageView);
}
@Override
protected Bitmap doInBackground(String... params) {
try {
URL url = new URL(params[0]);
return BitmapFactory.decodeStream(url.openConnection().getInputStream());
} catch (IOException e) {
return null;
}
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
ImageView imageView = imageViewRef.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
}
在这里,Movie是一个简单的Java对象,用于表示电影的标题和图像URL。MoviePresenter是一个继承自Presenter的对象,用于显示电影卡片。它还需要一个相应的布局文件movie_card.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="@android:drawable/dialog_holo_light_frame">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scaleType="centerCrop"
android:adjustViewBounds="false"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"/>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textAppearance="@android:style/TextAppearance.Holo.Large"
android:gravity="center"
android:paddingTop="8dp"
android:paddingBottom="8dp"/>
</LinearLayout>
在VerticalGridSupportFragment中使用MoviePresenter和Layout,可以使用以下代码:
VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
gridPresenter.setNumberOfColumns(NUM_COLUMNS);
gridFragment.setPresenter(gridPresenter);
GridItemPresenter itemPresenter = new GridItemPresenter();
ArrayObjectAdapter adapter = new ArrayObjectAdapter(itemPresenter);
for (int i = 0; i < MOVIE_ITEMS.size(); i++) {
adapter.add(MOVIE_ITEMS.get(i));
}
gridFragment.setAdapter(adapter);
在这里,GridItemPresenter是一个继承自Presenter的对象,用于显示每个项目的布局和外观。它也需要一个相应的布局文件grid_item.xml,用于显示电影卡片。
通过这种方式使用VerticalGridSupportFragment,可以方便地创建实现类似于电视用户界面的应用程序,包括网格列表和其他Leanback库组件。
```java
public class CustomVerticalGridFragment extends VerticalGridSupportFragment {
private ArrayObjectAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupAdapter();
setupGrid();
}
private void setupAdapter() {
mAdapter = new ArrayObjectAdapter(new CardPresenter()); // Use your custom CardPresenter
// Add cards to the adapter
mAdapter.add(new Card("Card 1"));
mAdapter.add(new Card("Card 2"));
// Add more cards as needed
setAdapter(mAdapter);
}
private void setupGrid() {
int numColumns = 4; // Set the number of columns in the grid
setGridLayoutManager(new GridLayoutManager(getActivity(), numColumns));
setTitle("Grid Title"); // Set the title for the grid
}
}
```java
public class CardPresenter extends Presenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
// Create and return a custom ViewHolder for your card layout
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item) {
// Bind data to your card layout
Card card = (Card) item;
TextView cardTitle = viewHolder.view.findViewById(R.id.card_title);
cardTitle.setText(card.getTitle());
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
// Clean up any resources used by the ViewHolder
}
}
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/card_image"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@drawable/card_image" />
<TextView
android:id="@+id/card_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#000000" />
</LinearLayout>
最后,在活动或片段中,将 CustomVerticalGridFragment 添加到布局中
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, new CustomVerticalGridFragment())
.commit();