IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android实现recyclerview吸顶功能 -> 正文阅读

[移动开发]Android实现recyclerview吸顶功能

? ?最近在做需求的时候遇到了这样的一个问题,需要完成一个recyclerview的吸顶效果的功能,一开始的提供的方案是,去监听需要进行吸顶吸顶功能的位置,然后根据这个具体的位置的信息来判断是否进行吸顶效果的逻辑。总感觉这样实现有点问题,感觉有点不太好实现,于是去看了好多别人的实现,感觉和自己的需求不太满足。找了一上午没有确定下来最终的方案,于是到了中午去吃饭回来的做电梯回工位的时候,突然有了思路。先大概的说一下这个思路吧,实现吸顶效果无非就是两个view交替的显示,在显示的时候另一个隐藏的效果。废话不多说先看效果图:

一般的需要吸顶的view是隐藏在这个activity的最顶部的,在recycler的item中还有与之对应的view,当item中的view和最顶部的position相等且顶部的position大于当前的item的view时就显示否则就隐藏,这个是实现整个效果的核心点。上代码,我尽可能的将代码整全。

首先我们需要创建一个recyclerview的效果,先看recyclerview所在的activity的xml代码

test_activity:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MyTestActivity">

    <LinearLayout
        android:id="@+id/ll_test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="吸顶文字"
            android:textColor="@color/black"
            android:textSize="20sp" />
    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</RelativeLayout>

将吸顶效果的view进行隐藏

接着看一下recyclerview对应的item的xml代码

tem_test.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:orientation="horizontal">

    <LinearLayout
        android:id="@+id/ll_test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="吸顶文字"
            android:textColor="@color/black"
            android:textSize="20sp" />

    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_context1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="sssssss"
            android:textColor="@color/black"
            android:textSize="26sp" />

        <TextView
            android:id="@+id/tv_context2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:text="aaaaa"
            android:textColor="@color/black"
            android:textSize="26sp" />
    </LinearLayout>


</RelativeLayout>

同样的将对应的view进行隐藏

接下来是逻辑代码,写一个测试用的recyclerview的bean类

TestBean:

package com.example.mytestproject;

/**
 * @describe:
 * @created 2021/8/1
 */
public class TestBean {
    String context1;
    String context2;

    public String getContext1() {
        return context1;
    }

    public String getContext2() {
        return context2;
    }

    public void setContext1(String context1) {
        this.context1 = context1;
    }

    public void setContext2(String context2) {
        this.context2 = context2;
    }
}

接下来写一下他对应的adapter

MyTestAdapter:

package com.example.mytestproject;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

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

import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * @describe:
 * @created 2021/8/1
 */
public class MyTestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<TestBean> mList;

    public MyTestAdapter(Context context, List<TestBean> list) {
        this.mContext = context;
        this.mList = list;
    }

    @NonNull
    @NotNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_test, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull RecyclerView.ViewHolder holder, int position) {
        ViewHolder viewHolder = (ViewHolder) holder;
        viewHolder.mTvContext1.setText(mList.get(position).getContext1());
        viewHolder.mTvContext2.setText(mList.get(position).getContext2());
        if (position == 10) {
            //设定吸顶view的显示地方,这里我写好10,可以根据具体哦的业务需求向外暴露这个position值
            viewHolder.mLlTest.setVisibility(View.VISIBLE);
        }

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView mTvContext1, mTvContext2;
        LinearLayout mLlTest;

        public ViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);
            mTvContext1 = itemView.findViewById(R.id.tv_context1);
            mTvContext2 = itemView.findViewById(R.id.tv_context2);
            mLlTest = itemView.findViewById(R.id.ll_test);
        }
    }
}

recyclerview的adapter的大多数方法就不具体的分析了,其中主要是显示那个item的地方需要注意,可以根据自己的业务来向外暴露一个position的值,这里我就写死了。同时,我建议可以使用eventbus的方式将这个值传入到activity中进行逻辑的判断。

接下来是Activity的逻辑:

MyTestActivity:

package com.example.mytestproject;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

public class MyTestActivity extends AppCompatActivity {
    RecyclerView mRvTest;
    LinearLayout mLlTest;
    MyTestAdapter myTestAdapter;
    List<TestBean> testBeans = new ArrayList<>();
    TestBean testBean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initView();
        setData(testBeans);
        initRecyclerView();
    }

    private void initView() {
        mRvTest = findViewById(R.id.rv_test);
        mLlTest = findViewById(R.id.ll_test);
    }

    private void initRecyclerView() {
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRvTest.setLayoutManager(linearLayoutManager);
        myTestAdapter = new MyTestAdapter(this, testBeans);
        mRvTest.setAdapter(myTestAdapter);
        mRvTest.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull @NotNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                /**
                 *获取最顶部position的位置
                 */
                int topPosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
                if (dy > 0 && topPosition > 10) {
                    /**
                     * dy > 0是向上滑动,dy < 0 是下滑动
                     */
                    mLlTest.setVisibility(View.VISIBLE);
                    Log.d("上下滑", String.valueOf(dy).toString());
                } else if (dy < 0 && topPosition <= 10) {
                    mLlTest.setVisibility(View.GONE);
                    Log.d("上下滑", String.valueOf(dy).toString());
                }

            }
        });

    }

    private void setData(List<TestBean> testBeans) {
        testBean = new TestBean();
        for (int i = 0; i < 100; i++) {
            testBean.setContext1("item左内容");
            testBean.setContext2("item右内容");
            testBeans.add(testBean);
        }
    }
}

在activity中获取顶部的position,与adapter中需要显示的view进行判断,如果最顶部的position大于他就显示,同时为了显示效果更好,还进行监听recycler的滑动状态根据滑动的状态来进行判断当前的位置是否显示。总之,感觉这样实现能完成需求,但是感觉不太好,希望有好的方案可以私信我。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 10:55:55  更:2021-08-02 10:56:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 5:43:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码