AS作业三仿微信APP实现对有recycleView的页面进行点击跳转设计
RecycleView是Android5.0推出的,它用来代替ListView和GridView,并且能够实现瀑布流中的布局,更加高级并且更加灵活,提供更为高效的回收复用机制,同时实现管理和视图的解耦合。
Android studio活动在其生命周期的四种状态分别是:
运行状态
暂停状态
停止状态
销毁状态
Activity与生命周期的有关的几个方法:
onCreate方法:创建页面。把页面上的各个元素加载到内存中。
onStart方法:开始页面。把页面显示在屏幕上。
onResume方法:恢复页面。让页面在屏幕上活动起来,例如开机动画,开始任务。
onPause方法:暂停页面。让页面在屏幕上的动作停下来。
onStop方法:停止页面。把页面从内存上撤下来。
onDestroy方法。销毁页面。把页面琮内存中清除掉。
onRestart方法。重新加载内存中的页面数据。
由于我们之前已经完成了布局,一个整体的这样的一个框架,所以我们这次做的时候需要改动的就只有其中一个fragment,而不需要去调节整个mainactivity,在理清楚逻辑之后,咱们可以开始修改/添加了。这里我就来说一下滑动删除怎样来写吧!
由于我们之前已经完成了布局,一个整体的这样的一个框架,所以我们这次做的时候需要改动的就只有其中一个fragment,而不需要去调节整个mainactivity,在理清楚逻辑之后,咱们可以开始修改/添加了。这里我就来说一下滑动删除怎样来写吧!
1、添加布局文件
因为之前我们已经做了四个tab,显示了textview的内容,而这次我们要使用recycleview来创建列表,所以我们就可以修改其中的一个,如下:
这里的话就很简单的添加一个recycleview就行了,然后设置一下各种参数,id,layout_width,layout_height等等,我就不多说了,添加了布局之后,我们就需要去调用它
2、获取对象句柄,将其连接到布局管理器,并为要显示的数据附加适配器,首先来看activity的内容
public class weixinFragmentextends Fragment {
Viewview;
SwipeAdapteradapter;
RecyclerViewrcvSwipe;
private final ListmList =new ArrayList<>();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private void initData() {
mList.add("亚特兰大老鹰");
mList.add("夏洛特黄蜂");
mList.add("迈阿密热火");
mList.add("奥兰多魔术");
mList.add("华盛顿奇才");
mList.add("波士顿凯尔特人");
mList.add("布鲁克林篮网");
mList.add("纽约尼克斯");
mList.add("费城76人");
mList.add("多伦多猛龙");
mList.add("芝加哥公牛");
mList.add("克里夫兰骑士");
mList.add("底特律活塞");
mList.add("印第安纳步行者");
mList.add("密尔沃基雄鹿");
mList.add("达拉斯独行侠");
mList.add("休斯顿火箭");
mList.add("孟菲斯灰熊");
mList.add("新奥尔良鹈鹕");
mList.add("圣安东尼奥马刺");
mList.add("丹佛掘金");
mList.add("明尼苏达森林狼");
mList.add("俄克拉荷马城雷霆");
mList.add("波特兰开拓者");
mList.add("犹他爵士");
mList.add("金州勇士");
mList.add("洛杉矶快船");
mList.add("洛杉矶湖人");
mList.add("菲尼克斯太阳");
mList.add("萨克拉门托国王");
}
private void initView() {
adapter =new SwipeAdapter(getActivity());
rcvSwipe =view.findViewById(R.id.rcv_swipe);
rcvSwipe.setLayoutManager(new LinearLayoutManager(getActivity()));
rcvSwipe.setHasFixedSize(true);
rcvSwipe.setAdapter(adapter);
adapter.setSwipeDataList(mList);
ItemTouchHelper.Callback callback =new SwipeItemTouchHelper(adapter);
ItemTouchHelper touchHelper =new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(rcvSwipe);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.tab01, container,false);
initView();
initData();
return view;
}
}
具体的写法其实都差不多,官网里有固定的写法,这里我就说一下传参的问题,因为之前传参的原因导致出了很多问题,像最后一个view,本来是我自己定义一个,开始是空值,后来才发现,然后就将return 啥的改成了view,之前我也不知道是啥,然后还有就是调用initData和initView,不能放错位置
3、添加列表适配器
要将所有数据输入列表中,您必须扩展 RecyclerView.Adapter 类。此对象会创建项的视图,并在原始项不再可见时用新数据项替换部分视图的内容。下面是我的adapter的例子,实际上结构大体差不多,在下面的方法中不同的动画有不同的写法,所以修改起来很容易
public class SwipeAdapterextends RecyclerView.Adapterimplements ItemTouchHelperListener {
private final ContextmContext;
private ListmList =new ArrayList<>();
public SwipeAdapter(Context context) {
mContext = context;
}
public void setSwipeDataList(List list) {
mList = list;
notifyDataSetChanged();
}
@NonNull
@Override
public SwipeViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.swipe_recycle_item, parent,false);
return new SwipeViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SwipeViewHolder holder,int position) {
holder.tvContent.setText(mList.get(position));
}
@Override
public int getItemCount() {
return mList ==null ?0 :mList.size();
}
@Override
public void onItemDismiss(int position) {
if (position <0 || position > getItemCount()) {
return;
}
mList.remove(position);
notifyItemRemoved(position);
// 解决 RecyclerView 删除 Item 导致位置错乱的问题
if (position !=mList.size()) {
notifyItemRangeChanged(position,mList.size() - position);
}
}
public static class SwipeViewHolderextends RecyclerView.ViewHolder {
TextViewtvContent;
public SwipeViewHolder(View itemView) {
super(itemView);
tvContent = itemView.findViewById(R.id.tv_content);
}
}
}
每当某项内容发生变化时,RecyclerView 会使用 animator 来更改其外观。该 animator 是扩展抽象 RecyclerView.ItemAnimator 类的对象。默认情况下,RecyclerView 使用 DefaultItemAnimator 来提供动画。如果您想提供自定义动画,可以通过扩展 RecyclerView.ItemAnimator 来定义自己的 animator 对象。如下,这只是我的这个动画的写法,想要不同的动画都可以,看你自己想怎么写
public class SwipeItemTouchHelperextends ItemTouchHelper.Callback {
private final SwipeAdaptermAdapter;
public SwipeItemTouchHelper(SwipeAdapter adapter) {
mAdapter = adapter;
}
/**
* 设置滑动类型标记
*/
@Override
public int getMovementFlags(@NotNull RecyclerView recyclerView, RecyclerView.@NotNull ViewHolder viewHolder) {
int dragFlags =0;// 禁止上下拖动
int swipeFlags = ItemTouchHelper.LEFT;// 只允许从右向左滑动
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(@NotNull RecyclerView recyclerView, RecyclerView.@NotNull ViewHolder viewHolder, RecyclerView.@NotNull ViewHolder target) {
return false;
}
/**
* 滑动删除 Item 的操作
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder,int direction) {
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
/**
* 设置 Item 不支持长按拖动
*/
@Override
public boolean isLongPressDragEnabled() {
return false;
}
/**
* 设置 Item 支持滑动
*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
/**
* Item 被选中时候,改变 Item 的背景
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,int actionState) {
// item 被选中的操作
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundResource(R.drawable.select_bg);
}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* 移动过程中重新绘制 Item,随着滑动的距离,设置 Item 的透明度
*/
@Override
public void onChildDraw(@NotNull Canvas c,@NotNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,float dX,float dY,int actionState,boolean isCurrentlyActive) {
float x = Math.abs(dX) +0.5f;
float width = viewHolder.itemView.getWidth();
float alpha =1f - x / width;
viewHolder.itemView.setAlpha(alpha);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
/**
* 用户操作完毕或者动画完毕后调用,恢复 item 的背景和透明度
*/
@Override
public void clearView(@NotNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 操作完毕后恢复颜色
viewHolder.itemView.setBackgroundResource(R.drawable.common_bg);
viewHolder.itemView.setAlpha(1.0f);
super.clearView(recyclerView, viewHolder);
}
}
这里就是自定义的动画,实际上我们将中间的禁止上下滑动和只允许从右往左滑动可以改为上下左右都可以滑动,也比较简单。最后我们需要一个监听程序
public interface ItemTouchHelperListener {
void onItemDismiss(int position);
}
因为我们点击是系统要识别,就跟之前的点击页面可以切换是一样的,所以我也就不多说了,
代码地址:老男孩/weixin - Gitee.com
AS作业三仿微信APP实现对有recycleView的页面进行点击跳转设计相关推荐
- app门户开发——recycleView的页面的点击跳转
关于recycleView的页面进行点击跳转设计 ①功能实现 ②实现过程 ③运行结果 ④代码地址 ①功能实现 实现对有recycleView的页面进行点击跳转设计 ②实现过程 创建四个activity ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- uniapp 即时通讯_uni-App 仿微信 App 即时通讯|vue+uniapp 聊天
项目介绍 基于uni-app+vue+vuex+uniPop+swiper等技术开发仿微信App聊天室实战项目,实现了发送消息.表情(gif动图),图片预览.地图位置.红包.仿微信朋友圈等功能. 项目 ...
- 高仿微信APP实战(一)-Actionbar的制作与应用
高仿微信APP实战(一)-Actionbar的制作与应用 本文是仿微信app实战系列的第一部分,先从简单的做起,边做边学习.从顶部actionbar开始,先看一下效果图: 一.定义主题样式 <r ...
- Android studio心得——用fragment仿微信APP
前言 今天我想与大家分享一些关于如何利用fragment实现仿微信APP的经验.作为社交领域最受欢迎.功能齐全且可扩展性强的应用之一,微信APP在浏览器首页和个人中心之上还有一个重要部分:底部导航栏. ...
- uniapp+nvue实现仿微信App界面+功能 —— uni-app实现聊天+语音+视频+图片消息
基于uniapp + nvue实现的uniapp仿微信界面功能聊天应用 txim 实例项目,实现了以下功能. 1: 聊天会话管理 2: 好友列表 3: 文字.语音.视频.表情.位置等聊天消息收发 4: ...
- vue移动端过渡动画_Vue仿微信app页面跳转动画效果
10:14:11独立开发者在开发移动端产品时,为了更高效,通常会使用Web技术来开发移动端项目,可以同时适配Android.iOS.H5,稍加改动还可适配微信小程序. 在使用Vue.js开发移动端页面 ...
- vue 移动端 跳转页面_Vue 仿微信 app 页面跳转动画
独立开发者在开发移动端产品时,为了更高效,通常会使用 Web 技术来开发移动端项目,可以同时适配 Android.iOS.H5,稍加改动还可适配微信小程序. 在使用 Vue.js 开发移动端页面的时候 ...
- Vue仿微信app页面跳转动画
独立开发者在开发移动端产品时,为了更高效,通常会使用Web技术来开发移动端项目,可以同时适配Android.iOS.H5,稍加改动还可适配微信小程序. 在使用Vue.js开发移动端页面的时候,默认的组 ...
最新文章
- 31 天重构学习笔记29. 去除中间人对象
- 再谈 $* 和 $@ 在 Bash 中的表现
- JS 根据子网掩码,网关计算出所有的IP范围
- opencv相机标定和人头姿态估计案例
- day09_读写分离_Atlas小记
- [恢]hdu 1019
- linux中高端内存和低端内存的概念【转】
- mysql基础操作(二)
- 11.重载示例(下)
- Mac天真答疑「6」mac系统使用技巧入门
- 多线程----简单的生产者和消费者
- php中获取不到当前元素,PHP 中数组获取不到元素
- 弘辽科技:淘宝开店类别怎么选择?淘宝开店如何选类目?
- CentOS 5 全功能WWW服务器搭建全教程 V3.0 【转】
- 运维派 企业面试题45 创建10个 用户 ; ping探测主机是否在线
- 【射频知识】吸波材料
- 上海升级为欧莱雅集团北亚区总部;西门子与太古可口可乐将共同打造18座数字化工厂 | 美通企业日报...
- equest源码分析及其与==的区别
- 编译:一个 C 程序的艺术之旅
- Collections用法
热门文章
- LIO-PPF:通过增量平面预拟合和跟踪的快速激光雷达惯导里程计
- K3 WISE 开发插件《K3 WISE常用数据表整理》
- 教师提高计算机水平的标语,学校教师标语:在改变中成长,在创新中完善。
- html设置表格外框线内框线6,Word里的表格怎么分别设置外框线和内框线?我怎么弄都不行?...
- python脚本写ui自动化_如何用Airtest编写UI自动化脚本
- 名片设计的意义及分类
- R语言使用rnorm函数生成正太分布数据、使用plot函数可视化折线图、使用text函数在可视化图像的指定位置添加自定义文本
- 计算机等级考试三级数据库
- setAttribute、getAttribute 和 getParameter
- jbpm4.4 使用之活动标签