VerticalGridSupportFragment如何使用

尝试Leanback的VerticalGridSupportFragment布局,但只加 载一个标题,参考太少,网格区域的卡片不懂该怎么加载.

最底下附上BrowseSupportFragment()布局的使用,参照它VerticalGridSupportFragment完全不行

img


好像发觉自定义适配器继承Presenter()连上面的界面都运行不了,只能继承VerticalGridPresenter才能正常加载界面

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
    }
}

但是用像以下步骤添加数据运行就闪退

img


img


需求①,像下图这样加载出相应的图片和名字.需求②,如果图片是网络uri类型的又该怎么加载.请用kotlin,我不懂java

img


按照这篇资料,ImageCareViewPresenter不能直接使用,新建这个类又不知道怎么具体的参数,

img


img


GridFragment.kt

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
    }
}

activity.main.xml

<?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>

MainActivity.kt

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()
        }
    }
}

Movie.kt

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"

BrowseSupportFragment布局的使用

img


MainFragment.kt

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
    }
}

CardPresenter.kt

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添加到布局中。

img


你可以根据您的需求自定义VerticalGridPresenter和适配器类,以便显示您想要的内容和样式。
请注意,VerticalGridSupportFragment是Android Support Library中的一个类,因此您需要在您的项目中包含相应的库依赖。

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库组件。

  1. 创建一个扩展 VerticalGridSupportFragment 的自定义类

```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();