首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RecyclerView中具有动态项目宽度的水平滚动

在 Android 开发中,使用 RecyclerView 实现具有动态项目宽度的水平滚动是一个常见的需求。你可以通过自定义 RecyclerView.AdapterRecyclerView.LayoutManager 来实现这一点。以下是一个详细的实现步骤:

1. 添加依赖项

确保你的项目中已经添加了 RecyclerView 的依赖项。如果没有,请在 build.gradle 文件中添加:

代码语言:javascript
复制
dependencies {
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
}

2. 创建布局文件

创建一个 RecyclerView 的布局文件,例如 activity_main.xml

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:scrollbars="horizontal" />
</LinearLayout>

3. 创建项目布局文件

创建一个项目布局文件,例如 item_layout.xml,其中项目的宽度是动态的:

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Item"
        android:textSize="18sp" />
</LinearLayout>

4. 创建数据模型

创建一个简单的数据模型类,例如 Item.java

代码语言:javascript
复制
public class Item {
    private String text;
    private int width;

    public Item(String text, int width) {
        this.text = text;
        this.width = width;
    }

    public String getText() {
        return text;
    }

    public int getWidth() {
        return width;
    }
}

5. 创建适配器

创建一个适配器类,例如 MyAdapter.java

代码语言:javascript
复制
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 MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<Item> itemList;

    public MyAdapter(List<Item> itemList) {
        this.itemList = itemList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Item item = itemList.get(position);
        holder.textView.setText(item.getText());

        // 动态设置项目宽度
        ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
        layoutParams.width = item.getWidth();
        holder.itemView.setLayoutParams(layoutParams);
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

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

6. 设置 RecyclerView

MainActivity.java 中设置 RecyclerView

代码语言:javascript
复制
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private MyAdapter adapter;
    private List<Item> itemList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));

        itemList = new ArrayList<>();
        itemList.add(new Item("Item 1", 200));
        itemList.add(new Item("Item 2", 300));
        itemList.add(new Item("Item 3", 250));
        itemList.add(new Item("Item 4", 400));
        itemList.add(new Item("Item 5", 150));

        adapter = new MyAdapter(itemList);
        recyclerView.setAdapter(adapter);
    }
}
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android:流式布局实现总结

1 什么是流式布局/标签 说白了呢,就是一种参差不齐的视图,比如: 水平的流式布局 ? 垂直的流式布局 ? 多条目类型流式布局 ? 2实现方式有哪些?...RecyclerView+GridLayoutManager+Span 3实现方式分析 (1)、自定义FlowLayout 关于自定义FlowLayout,原理就是自定义一个ViewGroup,向里动态的添加条目...在添加的时候需要动态的计算行数,以及行中剩余宽度是否可以展示目标条目。...通常情况下,与ChipGroup配套使用的是Chip——也就是ChipGroup中的条目。Chip本身具有选中和点击状态,也可以加入图片,可以修改文本(颜色、字号、字体等)。...但是在构建对象时必须指定行或者列,这样就导致内容超过屏幕宽度或者高度时,并不会主动换行——而是优先适配行数或列数,然后滚动显示。

5.2K20
  • 自定义View实现水平滚动控件

    前几天项目中需要使用到一个水平可滚动的选择条,类似下图效果(图片是从简书上一位作者那儿找来的,本篇也是在这位作者的文章的基础上修改的,站在大神的肩膀上,哈哈,由于原文没有提供demo,而且实现的效果跟我要的不一样...这个滚动选择条主要基于RecyclerView实现,实现的功能如下: 1. 滚动选择   2.点击选择   3.选中项目居中高亮显示 效果图如下: ?...介绍下我的这个demo的使用,非常简单: 1.在xml中加入自定义的布局 写入自定义view的包名全路径,设置一下其他基本属性,完事。 ?...2.在MainActivity中设置使用     (1)找到自定义的view和其中的RecyclerView     (2)准备数据     (3)添加监听器              这个监听器主要是为了获取...RecyclerView的宽度,因为在onCreate执行的时候,视图还没有绘制出来,直接getMeasureWidth()等方法获取的都是0,这个监听器给视图添加一个回调,在视图绘制的瞬间就可以获得视图宽度

    90620

    【Android从零单排系列二十六】《Android视图控件——ScrollView》

    在ScrollView中,只能包含一个直接子视图(ViewGroup),通常是一个垂直方向的线性布局或相对布局。如果需要水平滚动效果,可以使用HorizontalScrollView作为替代。...二 ScrollView使用方法 在XML布局文件中定义ScrollView容器。在需要可滚动内容的区域内添加ScrollView标签,并指定其宽度、高度以及其他属性。...android:scrollbars:定义滚动条的显示方式。可选值有"none"(不显示)、"vertical"(只显示垂直滚动条)和"horizontal"(只显示水平滚动条)。...常见方法: scrollTo(int x, int y):将ScrollView滚动到指定的位置,参数x和y分别代表目标位置的水平和垂直偏移量。...在处理大数据集或需要与后端交互的情况下,推荐使用RecyclerView等更高级的容器组件来动态加载和展示数据,从而提供更好的性能和用户体验。

    46020

    【Android从零单排系列二十五】《Android视图控件——RecyclerView》

    一 RecyclerView基本介绍 RecyclerView是Android支持库中的一个强大的视图容器,用于显示和管理大量数据集合的列表或网格。它是目前推荐使用的替代方式之一。...二 RecyclerView使用方法 在项目的build.gradle文件中添加RecyclerView的依赖: implementation 'androidx.recyclerview:recyclerview...android:layout_width和android:layout_height:设置RecyclerView的宽度和高度。...与ListView相比,RecyclerView具有许多优势: 灵活性:RecyclerView提供了更高级别的自定义选项,使开发者可以灵活控制列表项的布局、动画效果和交互行为。...复用机制:RecyclerView引入了ViewHolder模式,可以重复利用子项的视图,在滚动过程中减少布局操作,提高性能。

    38010

    根据数据源字段动态设置报表中的列数量以及列宽度

    在报表系统中,我们通常会有这样的需求,就是由用户来决定报表中需要显示的数据,比如数据源中共有八列数据,用户可以自己选择在报表中显示哪些列,并且能够自动调整列的宽度,已铺满整个页面。...本文就讲解一下ActiveReports中该功能的实现方法。 第一步:设计包含所有列的报表模板,将数据源中的所有列先放置到报表设计界面,并设置你需要的列宽,最终界面如下: ?...第二步:在报表的后台代码中添加一个Columns的属性,用于接收用户选择的列,同时,在报表的ReportStart事件中添加以下代码: /// /// 用户选择的列名称...,并计算需要显示控件的总宽度 for (int c = 0; c < cols.Count; c++) { if (!...源码下载: 动态设置报表中的列数量以及列宽度

    4.9K100

    CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar-Android M新控件

    滚动事件,那么在CoordinatorLayout布局里其它标记了app:layout_behavior的子View(LinearLayout、RecyclerView、NestedScrollView...ToolBar标记了layout_scrollFlags滚动事件,那么当LinearLayout滚动时便可触发ToolBar中的layout_scrollFlags效果 即往上滑动隐藏ToolBar,下滑出现...– (Tab的宽度平均分配),也实现了可滚动的选项卡 – (Tab宽度不固定,同时可以横向滚动),还实现了所有Tab居中显示。...然后在代码中动态添加Tab: TabLayout mTabLayout = (TabLayout) findViewById(R.id.tabLayout); mTabLayout.addTab(mTabLayout.newTab...布局下包裹一个可以滑动的布局,比如 RecyclerView,NestedScrollView(经过测试,ListView,ScrollView不支持)具有滑动效果的组件。

    2.2K30

    手把手教你打造RecyclerView滚动特效

    效果图 最近开发中遇到这样的需求,recyclerview的item随滚动改变大小和透明度。这个效果看起来挺有动感的,似乎实现起来有点复杂,其实不然,接下来将带领大家手把手实现这个效果。...RecyclerView总高度(包含不可见部分)与RecyclerView可见部分的高度相差得到;而scrollY则随着RecyclerView的滚动变化,因此需要对RecyclerView进行滚动事件的监听...与RecyclerView的滚动建立了关系;至此,动画与RecyclerView的逻辑关系梳理完毕。...按照实现RecyclerView的套路一步步实现最基本的列表效果,然后将动画与滚动监听的关系放入Adapter中。...当RecyclerView滑动太快时,单位滚动距离内,滚动监听事件的触发频率较低,导致有些Item的动画进度未达到100%便从屏幕中消失,从而存在重新滚动到那个Item时,Item的动画停留在1%~99%

    2.7K10

    recyclerView 进阶知识

    特殊的水平居中、左右两边缩放淡出的列表(Gallery画廊效果): 这里有几套方案, 1....5. recyclerViewPager 三方框架 左右view将中间的view裁剪掉了,这是和viewPager相似的问题,绘制Item的时候存在顺序,需要自己动态调试下 三 使用recyclerView...本人是在recyclerView 从内存中重启的时候 ,想保存一个排序和原始数据恢复位置时遇到。...基本上看stackoverflow和issue下面的回答,有帮助的大意是:recyclerView 的数据刷新不同步(导致滚动位置无法定位或调用scrollToPosition时不同步)。...这里由于产品需要,recyclerView的item的高度为动态的wrap_content(建议不要使用,recyclerView由于得不到具体宽高,会多次调用getView方法),又要求recyclerView

    1.2K40

    Android必知必会 - RecyclerView 恢复上次滚动位置

    记录 RecyclerView 滚动位置并恢复是一个很常见的需求,通常需要精准恢复到上次的位置。...预计会用到 RecyclerView 相关的三个知识点: 监听 RecyclerView 滚动状态 监听 RecyclerView 完成绘制 滚动 RecyclerView 到指定的位置 思路: 在「RecyclerView...前置知识 监听 RecyclerView 滚动状态 调用 recyclerView.addOnScrollListener(onScrollListener); 来设置 RecyclerView 的滚动监听器...().removeOnGlobalLayoutListener(this); } }); 滚动 RecyclerView 到指定的位置 具有类似功能的 API 有: RecyclerView.scrollToPosition...回顾总结 本次记录的是实际使用中的情况,基础偏移量的值不为 0 可能不是普遍现象,没看到过相关记录,特记录下来,避免后人踩坑吧。

    2.1K20

    Android RecyclerView 使用完全解析 体验艺术般的控件

    onDraw中实现了真正的绘制。...当然了,改为GridLayoutManager以后,对于分割线,前面的DividerItemDecoration就不适用了,主要是因为它在绘制的时候,比如水平线,针对每个child的取值为: final...有一点需要注意,如果是横向的时候,item的宽度需要注意去设置,毕竟横向的宽度没有约束了,应为控件可以横向滚动了。 如果你需要一样横向滚动的GridView,那么恭喜你。...高兴的是,github上已经有很多类似的项目了,这里我们直接引用下:RecyclerViewItemAnimators,大家自己下载查看。...通过简单改变下LayoutManager,就可以产生不同的效果,那么我们可以根据手机屏幕的宽度去动态设置LayoutManager,屏幕宽度一般的,显示为ListView;宽度稍大的显示两列的GridView

    1.6K10

    Android-UI布局---RecyclerView学习(二)利用它做的相册集效果

    这个代码在网上有, 横向ListView的功能,参考Android 自定义RecyclerView 实现真正的Gallery效果 首先说布局文件: RecyclerView视图中的item的布局: 的方法 * 构造函数,在这里设置 调用 ScrollListener的滚动事件 */ public MyRecyclerView(Context context, AttributeSet...这里是 水平混动 //需要实现的效果就是每次你滑动停止之后,srcollView 第一个View 展现在上面的大图片中 mCurrentView = getChildAt(0); if...需要学习的第二个知识点就是:在对应的activity中关于RecyclerView 的使用 RecyclerView的使用代码: //找到对应的视图控件 mRecyclerView = (MyRecyclerView...那么就必须解释下RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置

    1.4K30

    Android RecyclerView从入门到玩坏

    布局类 效果 LinearLayoutManager 以垂直或水平滚动列表方式显示项目 GridLayoutManager 在网格中显示项目 StaggeredGridLayoutManager 在分散对齐网格中显示项目...8.x 让GridLayoutManager展示不同宽度的条目 方的是4.x上的, 圆的是8.x上的, 可以看到, 变化还是很大的. 我们回正题....GridLayoutManager布局是可以设置宽度的, 不一定都是一样大的, 来看下实现. // 指定item宽度 gridLayoutManager.setSpanSizeLookup(new...设置宽度 当然了, 我还是很喜欢这个分隔线的, 我们来看看横着滚动的效果. 布局文件要改动: 的几次不理想表现, 具体项目要求还是要具体对待, 开源库也不是万能的. 最近不是又有什么开源项目套壳事件了嘛, 别人一开源就说自己有自主产权了真的好吗?

    2.1K30

    ConsecutiveScrollerLayout

    它的核心功能在于让所有子视图像一个整体一样顺滑地滚动,解决了多层嵌套滑动冲突的问题。它还能实现多种模式的吸顶效果,适应大多数复杂业务场景,支持动态控制吸顶视图的显示状态。...ConsecutiveScrollerLayout 的使用体验非常顺畅,无论是在页面中嵌套多个滚动视图,还是在动态切换视图时,滚动都不会出现明显卡顿或冲突。...常见的使用场景包括新闻详情页、商品详情页、仪表盘等内容丰富的页面。 项目中引入这个布局也非常简单。...: " + scrollY); } }); 这种方式在需要实现滚动联动、滚动动画或动态加载内容时非常有用。...项目遵循 Apache-2.0 开源协议,允许自由使用和修改源码。对于开发者来说,这是一个在 Android 应用中处理复杂嵌套滑动的理想选择。

    7310
    领券