Android Studio使用recyclerview实现展开和折叠功能(在之前的微信页面基础之上)
作者:qq_41206634 发布时间:2023-10-31 23:08:55
标签:android,studio,recyclerview,展开,折叠
Android中RecyclerView点击item展开列表详细内容
效果如下:
依然是xml文件的设计,使用了两个RelativeLayout
,zu作为主布局和副布局,里面都加入textview显示内容,在副布局里加入一个imageview在这里插入图片描述作为子内容的背景图,代码如下:
tab01.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rl_parent"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#00574B">
<TextView
android:id="@+id/textViewparent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:layout_centerInParent="true"
android:textColor="@android:color/white"
tools:text="主布局" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_child"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#ffffff"
android:visibility="gone">
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textViewchild"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="25dp"
android:textColor="#000000"
tools:text="副部局" />
</RelativeLayout>
</LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/top" />
<FrameLayout
android:id="@+id/id_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</FrameLayout>
<include layout="@layout/bottom" />
</LinearLayout>
核心代码Adapter:
public class adapter extends RecyclerView.Adapter <adapter.myviewholder>{
private List<String> mlist=new ArrayList<>();
private Context context;
private View inflater;
private static final String tag=adapter.class.getSimpleName();
private int expandedPosition=1;
private myviewholder mViewHolder;
public adapter(Context context) {//,List<String> list
this.context=context;
}
public void setExpandCollapseDataList(List<String> list){
mlist=list;
notifyDataSetChanged();
}
@Override
public adapter.myviewholder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
inflater= LayoutInflater.from(context).inflate(R.layout.tab01,viewGroup,false);
myviewholder myviewholder=new myviewholder(inflater);
return myviewholder;
}
@Override
public void onBindViewHolder(final adapter.myviewholder myviewholder, final int j) {
myviewholder.textviewparent.setText(mlist.get(j));
myviewholder.imageview.setImageResource(R.drawable.p1);
myviewholder.textviewchild.setText(mlist.get(j+15));
final boolean isExpanded=j==expandedPosition;
myviewholder.rlChild.setVisibility(isExpanded ? View.VISIBLE : View.GONE);
myviewholder.rlParent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mViewHolder != null) {
mViewHolder.rlChild.setVisibility(View.GONE);
notifyItemChanged(expandedPosition);
}
expandedPosition = isExpanded ? -1 : myviewholder.getAdapterPosition();
mViewHolder = isExpanded ? null : myviewholder;
notifyItemChanged(myviewholder.getAdapterPosition());
}
});
}
@Override
public int getItemCount() {
return mlist == null ? 0 : mlist.size()/2;
}
class myviewholder extends RecyclerView.ViewHolder{
private ImageView imageview;
RelativeLayout rlParent, rlChild;
TextView textviewparent, textviewchild;
public myviewholder(View itemView) {
super(itemView);
rlParent = itemView.findViewById(R.id.rl_parent);
rlChild = itemView.findViewById(R.id.rl_child);
textviewparent = itemView.findViewById(R.id.textViewparent);
textviewchild = itemView.findViewById(R.id.textViewchild);
imageview=itemView.findViewById(R.id.imageview);
}
}
}
主要的代码是 ViewHolder
中 bindView() , onClick() 这两个方法对变量的操作。将list中前一半作为主布局数据,后一半作为副布局的数据生成。
数据和执行
private void initmyData() {
list.add("路德维希·凡·贝多芬");
list.add("萧友梅");
list.add("阿炳");
list.add("冼星海");
list.add("聂耳");
list.add("施光南");
list.add("弗里德里克·肖邦");
list.add("罗伯特·舒曼");
list.add("莫扎特");
list.add("约瑟夫·海顿");
list.add("舒伯特");
list.add("巴赫");
list.add("弗仑兹·李斯特");
list.add("约翰奈斯·勃拉姆斯");
list.add("门德尔松");
list.add("德国作曲家、钢琴家、指挥家,被称为乐圣。");
list.add("中国专业音乐教育的奠基人和开拓者、音乐理论家、作曲家。");
list.add("民间音乐家、二胡演奏家,誉为演奏能手。");
list.add("中国近代作曲家、钢琴家--人民音乐家。");
list.add("中国音乐家--时代歌手。");
list.add("誉为时代歌手,现代抒情歌曲作曲家。");
list.add("誉为钢琴诗人,波兰作曲家、钢琴家。");
list.add("德国著名作曲家、音乐评论家。");
list.add("奥地利作曲家,被誉为神童。");
list.add("奥地利作曲家,维也纳古典派奠基者之一。");
list.add("奥地利作曲家--前所未有的最富诗意的音乐家。");
list.add("德国最伟大的古典作曲家之一,管风琴演奏家。");
list.add("天才的匈牙利作曲家、钢琴家、指挥家和音乐活动家。");
list.add("德国十九世纪后半叶最卓越的、古典乐派最后的一位作曲家。");
list.add("德国著名作曲家。");
}
private void initView1() {
adapter adapter = new adapter(this);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
recyclerView.setAdapter(adapter);
adapter.setExpandCollapseDataList(list);
}
话不多说,上代码。
github源码地址:
链接: https://github.com/YL009/yl.
来源:https://blog.csdn.net/qq_41206634/article/details/105156398


猜你喜欢
- 异常的练习:老师用电脑上课。开始思考上课中出现的问题。比如问题是电脑蓝屏。电脑冒烟。要对问题进行描述,封装成对象。可是当冒烟发生后,出现讲课
- 用java实现简易外卖订餐系统,供大家参考,具体内容如下一、使用技术javaSE二、实现功能外卖订餐系统具体要求如下:使用选择结构,循环结构
- 项目背景最近在项目上对接前端的的时候遇到了几个问题1.经常要问前端要请求参数2.要根据请求参数写大量if...else,代码散步在 Cont
- 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 p
- 一、基本介绍(Nexus(maven * ))1,如果没有搭建 * 会有什么问题?如果没有 * ,我们所需的所有构件都需要通过 Mave
- 在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。介绍
- 斗地主小游戏之洗牌发牌任务描述编写一个斗地主发牌洗牌的程序,要求按照斗地主的规则完成洗牌发牌的过程,牌面由花色色和数字(包括J,Q,K,A字
- Mybatis入门-基于配置实现单表的增删改查Mybatis简介官网链接:https://mybatis.org/mybatis-3/zh/
- 有时候需要动态添加数据,屏幕显示满了,数据需要滚动展示。这里主要弄懂scrollTo(0, off)方法的含义喊用法。含义不说了,大概意思就
- 本文实例为大家分享了Retrofit2 RxJava2实现Android App自动更新,具体内容如下功能解析自动更新可以说已经是App的标
- 题目要求java实现字符串中的字母排序并输出排序后的结果分析1、创建一个字符串,赋值并将字符逐个存进数组中。String str = &qu
- 本文实例讲述了android动态布局之动态加入TextView和ListView的方法。分享给大家供大家参考。具体实现方法如下:packag
- public class MainActivity extends Activity { @Override protected void
- 1、配置 IDEA 的 Maven 环境单击菜单栏中的 File → Settings → Build, Ex
- strcpy函数详解如下1.函数介绍1.1.函数接口char * __cdecl strcpy(char * dst, const char
- 有时候,我们的程序需要启动一些子进程,如嵌入的图形程序。当启动一个进程后,获得这个进程信息Process,然后其内部在某个时刻启动了一个子进
- Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,以下代码是我在学习是总结的,放到这里用于后
- 在很多系统开发中,我们希望在指定的方法调用之前或者之后能打印出该方法的调用时间以及方法的出参和入参,就可以使用spring的AOP,还可以结
- 栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。用栈实现队列—力扣232题题目要求:仅使用两个栈实现
- 曾经有一个朋友问过我一个问题, 一张512*512 150KB PNG格式图片和一张512*512 100KB 压缩比是8的JP