请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇

MPGankIO 布局篇

整个App到了这里就开始准备开始实现逻辑啦,有没有点小期待

后续如果有需要可以爬一波包包通缉令的数据O(∩_∩)O~~

我们的布局采用5.0之后的新布局控件

1.CardView

CardView特别的属性如下:

android:cardCornerRadius:在布局中设置card圆角的大小

CardView.setRadius:在代码中设置card圆角的大小

android:cardBackgroundColor:在布局中设置card背景的颜色

android:elevation:设置阴影的大小

card_view:cardElevation 阴影的大小

card_view:cardMaxElevation 阴影最大高度

card_view:cardCornerRadius 卡片的圆角大小

card_view:contentPadding 卡片内容于边距的间隔

card_view:contentPaddingBottom

card_view:contentPaddingTop

card_view:contentPaddingLeft

card_view:contentPaddingRight

card_view:contentPaddingStart

card_view:contentPaddingEnd

card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式

**card_view:cardPreventConrerOverlap

在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠**

我们要使用这个CardView来做卡片式的列表

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="5dp"

android:foreground="?android:attr/selectableItemBackground"

android:orientation="vertical"

app:contentPadding="5dp">

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@id/tv_title"

style="@style/txt_normal_style"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:ellipsize="end"

android:gravity="start"

android:maxLines="3"

android:text="标题"

android:textSize="16sp"

/>

android:id="@id/tv_name"

style="@style/txt_normal_style"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_below="@id/tv_title"

android:layout_marginTop="10dp"

android:gravity="bottom"

android:text="作者"

android:textColor="@color/colorPrimary"/>

android:id="@id/tv_publishtime"

style="@style/txt_normal_style"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:layout_below="@id/tv_title"

android:layout_marginTop="10dp"

android:gravity="bottom"

android:text="发表时间"/>

d8c06f380239

CardView 大部分适用于 listView 或者recyclerView的item中。

2.RecyclerView

RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:

使用LayoutManager来确定每一个item的排列方式。

为增加和删除项目提供默认的动画效果。

你也可以定义你自己的LayoutManager和添加删除动画,SDK中默认包含了三种布局

1. 横向布局(LinearLayoutManager)

2. Grid布局(GridLayoutManager)

3. 瀑布流布局(StaggeredGridLayoutManager)

Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。

LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,

LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。

总而言之就相当于ListView封装后再抽象,使item更加灵活

项目中我使用的是XRecyclerView,是封装了上拉刷新和下拉加载的一个库,非常好用还有挺多的加载动画可以切换,使用的方法也很简单,哈哈,偷懒!! 不都是说为了不要重复造轮子嘛~你懂的

3.Fragment

这个应该不用多讲了相信大家都会的

4.代码附上

MainFragment.java 这个就是为了在主页将一些数据初始化为了给TypeFragment拿到类型数据

d8c06f380239

为什么使用FragmentStateAdapter而不用FragmentPagerAdapter是因为viewpager页数比较多

FragmentStateAdatper的机制是空置的时候将其销毁释放内存,而FragmentPagerAdapter是将其dettach

因此选用FragmentSteteAdapter

GankViewPagerAdapter.java

public class GankViewPagerAdapter extends FragmentStatePagerAdapter {

private List mFragments;

private List mTitles;

public GankViewPagerAdapter(FragmentManager fm, List fragments, List titles) {

super(fm);

this.mFragments = fragments;

this.mTitles = titles;

}

@Override

public Fragment getItem(int position) {

return mFragments.get(position);

}

@Override

public int getCount() {

return mFragments.size();

}

@Override

public CharSequence getPageTitle(int position) {

return mTitles.get(position);

}

}

大家如果之前理解过MVP架构应该就会发现我调用的方式啦!

TypeFragment.java 核心模块

public class TypeFragment extends BaseMvpFragment implements

TypeFragmentView {

private static final String ARG_PARAM1 = "type";

@BindView(R.id.rv_list)

XRecyclerView rvList;

private String mCategory;

private View rootView;

private GankTypeCardAdapter mGankTypeCardAdapter;

private List mDatas;

private int curPage = 1;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if (getArguments() != null) {

mCategory = getArguments().getString(ARG_PARAM1);

}

initVariables();

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.fragment_type, container, false);

ButterKnife.bind(this, rootView);

resetDatas();

initViews();

return rootView;

}

@Override

public void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putString(ARG_PARAM1, mCategory);

}

@Override

public void onViewStateRestored(Bundle savedInstanceState) {

super.onViewStateRestored(savedInstanceState);

if (savedInstanceState != null) {

mCategory = ConvertUtil.toString(savedInstanceState.getString(ARG_PARAM1), "");//避免为NULL

}

}

@Override

public void initVariables() {

mDatas = new ArrayList<>();

}

@Override

public void initViews() {

initRecyclerView();

presenter.getTypeGankList();

}

private void initRecyclerView() {

rvList.setPullRefreshEnabled(true);

rvList.setLoadingMoreEnabled(true);

rvList.setLoadingListener(new XRecyclerView.LoadingListener() {

@Override

public void onRefresh() {

resetDatas();

presenter.getTypeGankList();

}

@Override

public void onLoadMore() {

presenter.getTypeGankList();

}

});

}

@Override

protected TypePresenter initPresenter() {

return new TypePresenter();

}

public static TypeFragment newInstance(String type) {

TypeFragment fragment = new TypeFragment();

Bundle args = new Bundle();

args.putString(ARG_PARAM1, type);

fragment.setArguments(args);

return fragment;

}

@Override

public String getCategory() {

return mCategory;

}

@Override

public int getCurPage() {

return curPage;

}

@Override

public void addOnePage() {

curPage++;

}

@Override

public void makeUpDatas(List datas) {

mDatas.addAll(datas);

}

@Override

public void notifyAdapter() {

if (mGankTypeCardAdapter == null) {

mGankTypeCardAdapter = new GankTypeCardAdapter(mActivity, mDatas);

rvList.setLayoutManager(new LinearLayoutManager(mActivity));

rvList.setAdapter(mGankTypeCardAdapter);

}

// TODO: 16/8/19 //此处可以优化成动画效果以及item逐个优化不需要整个重新排列

mGankTypeCardAdapter.notifyDataSetChanged();

rvList.refreshComplete();

rvList.loadMoreComplete();

}

@Override

public void resetDatas() {

curPage = 1;

mDatas.clear();

if (mGankTypeCardAdapter != null) {

mGankTypeCardAdapter.notifyDataSetChanged();

}

}

@Override

public void onDestroyView() {

mGankTypeCardAdapter = null;

super.onDestroyView();

}

}

最后就是P中调用V啦 就是传说中的解耦

d8c06f380239

到此基本上的请求列表功能结束啦,下一篇最终章就是列表点击事件和链接的内容页面!

有问题可以来我博客或者简书反馈,谢谢大家的停留在这里时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米净水器压力传感器_净水器中RO的完整形式是什么?

小米净水器压力传感器RO&#xff1a;反渗透 (RO: Reverse Osmosis) RO is an abbreviation of Reverse Osmosis. It is a course of action that aids the RO water purifier to banish unfavorable ions, dissolved solids, and TDS from the water. Reverse osmosis is the c…

即时通讯应用战争开打,到底谁能最终定义我们的交流方式?

题图&#xff1a;风靡亚洲的Line 北京时间4月4日消息&#xff0c;据科技网站TechRadar报道&#xff0c;对业界来说&#xff0c;即时通讯应用是一个巨大的市场&#xff0c;除了专门发力该领域的公司&#xff0c;专注搜索的谷歌和专注社交的Facebook最近几年也都开始深耕此类应用…

离散点自动生成等高线_有限自动机| 离散数学

离散点自动生成等高线有限状态机 (Finite state machine) A finite state machine (FSM) is similar to a finite state automation (FSA) except that the finite state machine "prints" an output using an output alphabet distinct from the input alphabet. Th…

android点击加号,Android仿微信朋友圈点击加号添加图片功能

本文为大家分享了类似微信朋友圈&#xff0c;点击号图片&#xff0c;可以加图片功能&#xff0c;供大家参考&#xff0c;具体内容如下xml:xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height&qu…

AI 创业公司 Kyndi 获850万美元融资,帮助公司预测未来

雷锋网(公众号&#xff1a;雷锋网)8月10日消息&#xff0c;据外媒报道&#xff0c; Kyndi 是一家总部位于帕洛阿尔托的 AI 创业公司。该公司今天宣布&#xff0c;已经完成了850万美元的 B 轮融资。 本轮融资的资金来源包括 PivotNorth Capital&#xff0c;Darling Ventures 和 …

css max-width_CSS中的max-width属性

css max-widthCSS | 最大宽度属性 (CSS | max-width property) The max-width property is used to help in setting the width of an element to the maximum. Although if the element or content is already larger than the maximum width then the height of that content…

20个编写现代CSS代码的建议

本文翻译自Danny Markov 的20-Tips-For-Writing-Modern-CSS一文。 本文归纳于笔者的Web Frontend Introduction And Best Practices:前端入门与最佳实践中CSS入门与最佳实践系列&#xff0c;其他的关于CSS样式指南的还有提升你的CSS姿势、Facebook里是怎样提升CSS代码质量的。本…

css 相同的css属性_CSS中的order属性

css 相同的css属性CSS | 订单属性 (CSS | order Property) Introduction: 介绍&#xff1a; Web development is an ever-growing field that would never find its end, therefore it is equally necessary to learn new ways to deal with the elements of the web page or …

StoreServ的ASIC架构师必须面向未来做出决断

StoreServ阵列采用特殊硬件&#xff0c;即一套ASIC来加速存储阵列操作&#xff0c;而且其每代阵列都会在这方面进行重新设计。目前的设计为第五代。 作为惠普企业业务公司研究员兼StoreServ架构师&#xff0c;Siamak Nazari当下主要负责第六代ASIC的设计工作。 每代ASIC设计往往…

android网页省略分页器,Android轻量级网页风格分页器

博客同步自:个人博客主页轻量级仿网页风格分页器&#xff0c;和RecycleView封装一起配合使用&#xff0c;也可单独使用&#xff0c;喜欢就star、fork下吧&#xff5e;谢谢目录功能介绍效果图如何引入简单使用依赖github地址功能介绍支持延迟加载分页支持单独分页器组件使用&…

传统存储做到极致也惊人!看宏杉科技发布的CloudSAN

传统存储阵列首先考虑的是高可靠、高性能。那么在成本上、扩展上、部署上就差。 互联网企业带来分布式存储&#xff0c;扩展上、部署上是优势了&#xff0c;但是单节点的可靠性差、数据一致性差、IO延迟大、空间浪费严重&#xff0c;能耗大。 这两者的问题&#xff0c;我想很多…

keil lic_LIC的完整形式是什么?

keil licLIC&#xff1a;印度人寿保险公司 (LIC: Life Insurance Corporation of India) LIC is an abbreviation of the Life Insurance Corporation of India. It is a public segment insurance and investment group corporation in India that generally deals with life …

“云”上存储初显规模 如何架构是关键

在安防系统中&#xff0c;存储设备只是给数据提供存储空间&#xff0c;数据存储的意义更多是为了给上层应用提供二次挖掘。目前的智能分析、大数据、图帧等技术都是基于数据存储做的数据挖掘。为了将二次挖掘应用的性能提升到最高&#xff0c;在优化分析算法的同时&#xff0c;…

【干货】分享总结:MySQL数据一致性

0、导读 沃趣科技数据库工程师罗小波为大家全面分析如何保证MySQL的数据一致性。 1、活动总结 罗小波老师从MySQL的崩溃数据恢复安全性、MySQL复制原理及异步&semi sync复制原理、MySQL主从服务器如何保证数据一致性等多方面分析如何保证MySQL的数据一致性。 分享内容满满的…

设置html按钮点击事件无效果,css怎么设置按钮不能点击?

css怎么设置按钮不能点击&#xff1f;下面本篇文章就来给大家介绍一下使用CSS设置按钮不能点击的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。想要按钮不能点击可以通过设置按钮点击事件失效来实现&#xff1b;而在CSS中&…

计算机图形学与几何造型导论_计算机图形学导论

计算机图形学与几何造型导论历史 (History) The main forerunner sciences to the development of modern computer graphics were the advances in electrical engineering, electronics, and television that took place during the first half of the twentieth century whe…

android 继承listview,Android listView 继承ListActivity的用法

Android listView 继承ListActivity的用法 在手机中经常有列表方式。如果Activity中只有唯⼀⼀个List(这也是通常的情况)&#xff0c;可以继承ListActivity来实现。我们用两个例子来学习List。List例子⼀&#xff1a;利用Android自带的List格式步骤⼀&#xff1a;Android XML文…

html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式

oauth2 authorization code 大致流程用户打开客户端后&#xff0c;客户端要求用户给予授权。用户同意给予客户端授权。客户端使用授权得到的code&#xff0c;向认证服务器申请token令牌。认证服务器对客户端进行认证以后&#xff0c;确认无误&#xff0c;同意发放令牌。客户端请…

Net设计模式实例之代理模式(Proxy Pattern)

一、代理模式简介&#xff08;Brief Introduction&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;对其他对象提供一种代理以控制对这个对象的访问。 二、解决的问题&#xff08;What To Solve&#xff09; 1、远程代理 远程代理&#xff0c;也就是为了一个对象…

jsonp请求html页面,JavaScript中的JSON和JSONP

简单地使用json并不能支持跨域资源请求&#xff0c;为了解决这个问题&#xff0c;需要采用jsonp数据交互协议。众所周知&#xff0c;js文件的调用不受跨域与否的限制&#xff0c;因此如果想通过纯web端跨域访问数据&#xff0c;只能在远程服务器上设法将json数据封装进js格式的…