文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Android】Jetpack全组件实战开发短视频应用App(十)

2022-06-06 14:09

关注

前言

我们已经把首页列表的

Item
布局完成,接下来我们就开始加载首页数据,我们这一篇主要是做封装,具体网络请求放在下一篇

引入依赖
//刷新分页组件
api 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0'
api 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0'
//viewmodel and livedata
api 'androidx.lifecycle:lifecycle-extensions:2.1.0'   
//paging分页组件
api 'androidx.paging:paging-runtime:2.1.0'

我们首页有下拉刷新和上拉加载,我们使用

SmartRefreshLayout
实现,分页使用
paging
,
viewmodel
livedata
我们导入了一个库
lifecycle-extensions
,当然你也可以分开导入

封装刷新组件

我们知道列表在加载的时候,如果没有数据,我们一般会展示一个空的布局,所以我们先自定义一个

EmptyView
,布局很简单,


然后我们创建一个

EmptyView
来加载这个xml,同时添加几个
set
方法


public class EmptyView extends LinearLayout {
    private ImageView icon;
    private TextView title;
    private Button action;
    public EmptyView(@NonNull Context context) {
        this(context, null);
    }
    public EmptyView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public EmptyView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }
    public EmptyView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int style) {
        super(context, attrs, defStyleAttr, style);
        setOrientation(VERTICAL);
        setGravity(Gravity.CENTER);
        LayoutInflater.from(context).inflate(R.layout.layout_empty_view, this, true);
        icon = findViewById(R.id.empty_icon);
        title = findViewById(R.id.empty_text);
        action = findViewById(R.id.empty_action);
    }
    public void setEmptyIcon(@DrawableRes int iconRes) {
        icon.setImageResource(iconRes);
    }
    public void setTitle(String text) {
        if (TextUtils.isEmpty(text)) {
            title.setVisibility(GONE);
        } else {
            title.setText(text);
            title.setVisibility(VISIBLE);
        }
    }
    public void setButton(String text, OnClickListener listener) {
        if (TextUtils.isEmpty(text)) {
            action.setVisibility(GONE);
        } else {
            action.setText(text);
            action.setVisibility(VISIBLE);
            action.setOnClickListener(listener);
        }
    }
}

接着就是编写我们的刷新布局了,由三部分组成,从上往下分别是头部刷新布局,列表,底部刷新布局,

SmartRefreshLayout
都给我们提供了,我们只需要拿来直接使用即可


封装列表
Fragment

接下来我们就封装一个

AbsListFragment
,这个是所有列表数据
Fragment
的基类,里面包括上拉加载/下拉刷新等操作,


public abstract class AbsListFragment extends Fragment implements OnRefreshListener, OnLoadMoreListener {
    private LayoutRefreshViewBinding mBinding;
    protected RecyclerView mRecyclerView;
    protected SmartRefreshLayout mRefreshLayout;
    protected EmptyView mEmptyView;
    protected PagedListAdapter mAdapter;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mBinding = LayoutRefreshViewBinding.inflate(inflater, container, false);
        mRecyclerView = mBinding.recyclerView;
        mRefreshLayout = mBinding.refreshLayout;
        mEmptyView = mBinding.emptyView;
        mRefreshLayout.setEnableRefresh(true);
        mRefreshLayout.setEnableLoadMore(true);
        mRefreshLayout.setOnRefreshListener(this);
        mRefreshLayout.setOnLoadMoreListener(this);
        mAdapter = getAdapter();
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
        mRecyclerView.setItemAnimator(null);
        //默认给列表中的Item 一个 10dp的ItemDecoration
        DividerItemDecoration decoration = new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL);
        decoration.setDrawable(ContextCompat.getDrawable(getContext(), R.drawable.list_divider));
        mRecyclerView.addItemDecoration(decoration);
        return mBinding.getRoot();
    }
    @Override
    public void onRefresh(@NonNull RefreshLayout refreshLayout) {
    }
    @Override
    public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
    }
    public abstract PagedListAdapter getAdapter();
}

我们先设置一些基本属性方法,包括上拉加载监听,下拉刷新监听,

RecyclerView
设置适配器等
不管是下拉刷新还是上拉加载都有回调,我们把这些回调的处理也写在这个
Fragment
中,方便我们后续使用

   public void finishRefresh(boolean hasData) {
   		//当前列表数据
        PagedList currentList = mAdapter.getCurrentList();
        //是否有数据
        hasData = hasData || currentList != null && currentList.size() > 0;
        RefreshState state = mRefreshLayout.getState();
        if (state.isFooter && state.isOpening) {
            mRefreshLayout.finishLoadMore();
        } else if (state.isHeader && state.isOpening) {
            mRefreshLayout.finishRefresh();
        }
        if (hasData) {
            mEmptyView.setVisibility(View.GONE);
        } else {
            mEmptyView.setVisibility(View.VISIBLE);
        }
    }

我们这里还需要把数据展示在我们的列表上,通过

PagedListAdapter
submitList
方法可以实现

   public void submitList(PagedList pagedList) {
        if (pagedList.size() > 0) {
            mAdapter.submitList(pagedList);
        }
        finishRefresh(pagedList.size()>0);
    }

OK,到目前我们这个

AbsListFragment
基本写完了,接下来我们让我们的
HomeFragment
实现它即可
原创文章 92获赞 320访问量 149万+ 关注 他的留言板 展开阅读全文
作者:Greathfs


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯