RecyclerView与Switch使item显示列数切换

  • 在结课作品中突然想到可以加这样一个需求点击按钮改变RecyclerView中item每行显示列数变化的需求,暂时只学习到配合Switch使用实现,其他的方法在接下来的学习中慢慢发出来,一起学习。

实现的效果图

<界面不是很好看,哈哈哈~>
在这里插入图片描述

实现代码

  • MainActivity内的代码
package com.c201801020240.fuzhibin;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener{
    private GridLayoutManager manager;
    RecyclerView mRecyclerView;
    MyAdapter mMyAdapter ;
    List<String> buttontext = new ArrayList<>();
    //结课小APP中想要实现的功能,暂时只想到这么多哈哈!
    String[] names=new String[]{"视频播放器","音乐播放器","天气预报","闹钟","便签"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //将要数组中的值一一放入要构造的 List 数组
        for(int i=0;i<names.length;i++){
            buttontext.add(names[i]);
        }
        initView();

    }

    private void initView() {
        Switch aswitch = findViewById(R.id.switch3);
        aswitch.setOnCheckedChangeListener(this);
        initRecyclerView();
    }


    private void initRecyclerView() {

        mRecyclerView = findViewById(R.id.recyclerview1);
        //设置Switch的另一个值,该值为你要显示列数的另一个值
        manager = new GridLayoutManager(this, 2);
		/*
		RecyclerView的尺寸在每次改变时,比如你加任何些东西。setHasFixedSize 的作用就是
        确保尺寸是通过用户输入从而确保RecyclerView的尺寸是一个常数。RecyclerView 的Item宽
        或者高不会变。每一个Item添加或者删除都不会变。如果你没有设置setHasFixedSized没有设
        置的代价将会是非常昂贵的。因为RecyclerView会需要而外计算每个item的size。
         */
        mRecyclerView.setHasFixedSize(true);
        mMyAdapter = new MyAdapter();
        mRecyclerView.setAdapter(mMyAdapter);
        mRecyclerView.setLayoutManager(manager);
        //默认在Switch未拨动时,显示的列数为一列
        changeShowItemCount(1);
    }


    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        int count = isChecked ? 2 : 1;
        changeShowItemCount(count);
    }

    private void changeShowItemCount(int count) {
       //Switch的状态对应一个值,我这里是一个对应1,和2。
       //这里这样设置是这样的:假设现在显示列数为1列,我拨动了Switch,状态改变了,那么就要切换到——
       //每行2列,用3减1的话就可得到2,反之当前为2,3减之后为1,此时就将变为每行1列。
        final int i = 3 - count;
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return i;
            }
        });
        //点击Switch后Switch的状态改变,意味着显示列数要改变,刷新RecyclerView布局操作
        mMyAdapter.notifyDataSetChanged();
    }
    //这以后的代码就不解释了,基本的RecyclerView用法
    class MyAdapter extends RecyclerView.Adapter<MyViewHoder>{

        @NonNull
        @Override
        public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = View.inflate(MainActivity.this, R.layout.item_layout, null);
            MyViewHoder myViewHoder = new MyViewHoder(view);
            return myViewHoder;
        }

        @Override
        public void onBindViewHolder(@NonNull MyViewHoder holder, int position) {
            String string = buttontext.get(position);
            holder.button.setText(string);

        }

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


    class MyViewHoder extends RecyclerView.ViewHolder {
        Button button;
        public MyViewHoder(@NonNull View itemView) {
            super(itemView);
            button=itemView.findViewById(R.id.button);

        }
    }

}

  • XML代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">


    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:background="#79BD98"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <Switch
            android:id="@+id/switch3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="30dp"
            android:layout_marginRight="30dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_editor_absoluteX="328dp" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="一个木盒"
            android:textColor="#ffffff"
            android:textSize="30sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.100000024" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview1"
        android:layout_width="409dp"
        android:layout_height="659dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/constraintLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
  • item_layout代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
    <Button
        android:id="@+id/button"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:background="@drawable/home_button"
        android:backgroundTint="#79BD98"
        android:text="Button"
        android:textColor="#FFFFFF"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

  • 按钮的shape小修改(不然太丑了,就配不上我的气质了,其实是怕拿不出手)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="15dp" ></corners>
</shape>

然后就顺利实现啦,小白一枚,有什么说得不对的地方,还请大佬多多指正。

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值