Android实现recyclerview列表展开更多和点击收起功能(以本地数据为例)

本文介绍如何使用Android的RecyclerView实现列表的展开与收起功能。通过XML布局定义了一个包含RecyclerView和阴影效果的FrameLayout,使用GridLayoutManager和spanCount设置网格布局。在适配器中设置了数据绑定,并提供了展示全部数据和隐藏部分数据的方法。在代码中初始化数据,设置点击事件来切换展开和收起状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看效果图是否是想要的,样式是灵活的,可根据需求自己去改变!
在这里插入图片描述
在这里插入图片描述
1.接下里就开始进入正题
布局:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/region_recy"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
            app:spanCount="4" />
        <!-- layoutManager:布局管理器 以上是以网格布局   spanCount:网格的数量 这里以四个为主
  这只是从xml中设置   也可以从代码中设置-->

        <!-- 阴影控件设置半透明-->
        <TextView
            android:id="@+id/txt_yinying"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_gravity="bottom"
            android:background="#b3ffffff" />
    </FrameLayout>

    <!-- 展开更多,点击收起-->
    <RelativeLayout
        android:id="@+id/rl_openall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="12dp">

        <TextView
            android:id="@+id/txt_open"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#03A9F4"
            android:gravity="center"
            android:text="展开更多"
            android:textColor="#FFEB3B"
            android:textSize="14sp" />
    </RelativeLayout>

</LinearLayout>

2.适配器中设置展开以及收起数据

package com.example.test;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class RegionAdapter extends RecyclerView.Adapter<RegionAdapter.ViewHolder> {
    private Activity activity;
    private List<String> list;

    public RegionAdapter(Activity activity) {
        this.activity = activity;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(activity).inflate(R.layout.rmsf_item, parent, false);
        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.mRmsfname.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    //显示收起时数据
    public void setHideList(List<String> newList) {
        this.list = newList;
        notifyDataSetChanged();
        //刷新数据
    }

    //显示全部数据
    public void setOpenList(List<String> openList) {
        this.list = openList;
        notifyDataSetChanged();
        //刷新数据
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private final TextView mRmsfname;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mRmsfname = itemView.findViewById(R.id.rmsf_name);
        }
    }
}

3.Adapter中的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="wrap_content">

    <TextView
        android:id="@+id/rmsf_name"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:textSize="20dp" />

</LinearLayout>

4.代码中设置全部显示数据和收起显示数据

初始化:
private void init() {
        recyclerView = findViewById(R.id.region_recy);
        opentext = findViewById(R.id.rl_openall);
        txtOpen = findViewById(R.id.txt_open);
        txtYinying = findViewById(R.id.txt_yinying);

        regionbeans = new ArrayList<>();
        regionbeans.add("四川");
        regionbeans.add("陕西");
        regionbeans.add("北京");
        regionbeans.add("广州");
        regionbeans.add("澳门");
        regionbeans.add("福建");
        regionbeans.add("海口");
        regionbeans.add("三亚");
        regionbeans.add("黑龙江");
        regionbeans.add("辽宁");
        regionbeans.add("吉林");
        regionbeans.add("天津");
        regionbeans.add("新疆");
        regionbeans.add("内蒙古");
        regionbeans.add("甘肃");
        regionbeans.add("宁夏");
        regionbeans.add("青海");
        regionbeans.add("西藏");
        regionbeans.add("江苏");
        regionbeans.add("安徽");
        regionbeans.add("上海");
    }

 private void initData() {
        List<String> mList = new ArrayList<>();
        List<String> HideList = new ArrayList<>();
        for (int i = 0; i < regionbeans.size(); i++) {
            mList.add(regionbeans.get(i));
        }
        //收起显示的数据仅显示10条  这里的仅显示灵活变动  
        for (int i = 0; i < 10; i++) {
            HideList.add(mList.get(i));
        }
        //适配器
        mRegionAdapter = new RegionAdapter(this);
        recyclerView.setAdapter(mRegionAdapter);
        //默认设置收起时的数据
        mRegionAdapter.setHideList(HideList);

        opentext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (txtOpen.getText().toString().equals("展开更多")) {
                    txtOpen.setText("点击收起");
                    txtYinying.setVisibility(View.GONE);
                    mRegionAdapter.setOpenList(mList);
                } else {
                    txtOpen.setText("展开更多");
                    txtYinying.setVisibility(View.VISIBLE);
                    mRegionAdapter.setHideList(HideList);
                }
            }
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值