背景
在手机开发中有水平列表,也有垂直列表,网格列表,leanback
中提供了针对rv封装的网格列表VerticalGridView
。我们用博客的文章数据来简单学习使用。
网格列表实现
先上效果图:
网格展示数据,焦点聚焦的view上面有一个放大效果
。
适配器实现(Presenter)
package com.example.androidtvdemo.demo04;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.leanback.widget.Presenter;
import com.bumptech.glide.Glide;
import com.example.androidtvdemo.R;
import com.example.androidtvdemo.net.BlogArticle;
public class BlogArticlePresenter extends Presenter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
View inflate = LayoutInflater.from(parent.getContext()).
inflate(R.layout.item_blog_article, parent, false);
return new Holder(inflate);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Object item) {
Holder holder = (Holder) viewHolder;
if (item instanceof BlogArticle.DataBean.ContentBean) {
Log.i("->>", "onBindViewHolder: 加载数据");
//holder.mTextView.setText((String) item);
BlogArticle.DataBean.ContentBean data = (BlogArticle.DataBean.ContentBean) item;
Glide.with(((Holder) viewHolder).mImageView.getContext())
.load("http://8.129.19.172:2020/portal/image/" +
((BlogArticle.DataBean.ContentBean) item).getCover())
.into(holder.mImageView);
}else {
Log.i("->>", "onBindViewHolder: 数据不对");
}
}
@Override
public void onUnbindViewHolder(ViewHolder viewHolder) {
}
public static class Holder extends ViewHolder {
private ImageView mImageView;
public Holder(View view) {
super(view);
mImageView = view.findViewById(R.id.iv_article_cover);
}
}
}
这里继承presenter
(属于leanback
)然后实现holder
就行,其他和rv的适配器一样了。
主要是页面数据获取和填充实现。
package com.example.androidtvdemo.demo04;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.leanback.widget.FocusHighlight;
import androidx.leanback.widget.FocusHighlightHelper;
import androidx.leanback.widget.ItemBridgeAdapter;
import com.example.androidtvdemo.BuildConfig;
import com.example.androidtvdemo.databinding.ActivityDemo04Binding;
import com.example.androidtvdemo.net.BlogArticle;
import com.example.androidtvdemo.net.HttpManager;
import com.example.androidtvdemo.net.IappService;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class Demo04Activity extends FragmentActivity {
private ActivityDemo04Binding mVb;
private ArrayObjectAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mVb = ActivityDemo04Binding.inflate(getLayoutInflater());
setContentView(mVb.getRoot());
mVb.vgv.setNumColumns(4);
//初始化列表需要的adapter
mAdapter = new ArrayObjectAdapter(new BlogArticlePresenter());
ItemBridgeAdapter iba = new ItemBridgeAdapter(mAdapter);
mVb.vgv.setAdapter(iba);
//选中放大效果增加这个代码,flat中有放大比例
FocusHighlightHelper.setupBrowseItemFocusHighlight(iba, FocusHighlight.ZOOM_FACTOR_MEDIUM, false);
//请求博客文章数据
IappService service = HttpManager.getService(IappService.class, BuildConfig.APP_BASE_URL);
service.getArticle().enqueue(new Callback<BlogArticle>() {
@Override
public void onResponse(Call<BlogArticle> call, Response<BlogArticle> response) {
//数据获取成功之后,显示图片数据
Log.i("->>", "onResponse: 获取数据成功");
List<BlogArticle.DataBean.ContentBean> content = response.body().getData().getContent();
//更新数据
mAdapter.setItems(content, null);
}
@Override
public void onFailure(Call<BlogArticle> call, Throwable t) {
t.printStackTrace();
}
});
}
}
获取我的博客的文章列表30个,然后填充到适配器中,这样数据就展示了。
最近一直在写demo,学习tv开发相关的知识,如果有开发tv的小伙伴,可以一起交流哦。
项目对应demo05,文章和包名一一对应的。
项目地址 https://gitee.com/dong_rong/android-tv-sample