首页
学习
活动
专区
工具
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本身具有选中和点击状态,也可以加入图片,可以修改文本(颜色、字号、字体等)。...但是在构建对象时必须指定行或者列,这样就导致内容超过屏幕宽度或者高度时,并不会主动换行——而是优先适配行数或列数,然后滚动显示。

4.2K20

从0系统学Android--3.6 RecyclerView

而且 ListView 扩展性不好,只能实现数据纵向滚动效果,如果想要实现横向滚动的话就做不到了。 为此 Android 提供了更为强大控件--RecyclerView。...实例,然后创建了一个 LinearlayoutManager 对象,并将它设置到了 RecyclerView 。...3.6.2 实现横向滚动和瀑布流布局 Listview 可扩展性不好,只能实现纵向滚动,如果想要横向滚动的话 ListView 就做不到了。下面用 RecyclerView 来实现横向滚动。...首先对子项布局进行修改一下,目前布局是水平排列,不适合水平滚动。 <?xml version="1.0" encoding="utf-8"?...需要注意: 在使用瀑布布局管理器时候,子项目的布局宽度是由分列数来决定

83820

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

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

89020

浅谈Android RecyclerView UI滚动控件示例

还有就是只能够纵向滚动,如果要想实现横向移动,用 ListView 是做不到RecyclerView 可以说是一个增强版 ListView 。...RecyclerView 现在可是官方推荐使用滚动控件哦O(∩_∩)O~ 1 基本用法 RecyclerView 也是新增控件,所以必须先在项目的 build.gradle 添加相应依赖库才能使用...然后在 ViewHolder 构造函数传入一个 View 参数,它是 RecyclerView 子项最外层布局,所以我们可以通过它来取得布局 ImageView 和 TextView 实例。...recyclerView 示例 我们使用了 recyclerView 创建出了 ListView 效果,而且代码逻辑更清晰咯。 2 横向滚动 现在让我们把这些猫变为 “横向滚动” 吧。...横向排列 我们可以在水平方向上滑动来查看屏幕外 “猫” 啦。

85110

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

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

37420

【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模式,可以重复利用子项视图,在滚动过程减少布局操作,提高性能。

32310

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

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

4.8K100

Android recyclerView横条指示器实现淘宝菜单模块

实现思路: 1.上方横滑列表可以直接使用RecyclerView实现; 2.下方指示器: (1).计算出RecyclerView划出屏幕距离w1和剩余宽度w2比例y,y = w1 / (总宽度w3...– 可使视区域宽度w4); (2).计算出指示器该移动距离w5= y * (指示器宽度w6- 滑块宽度w7); (3).指示器布局实现: <RelativeLayout android:id..., int dy) { super.onScrolled(recyclerView, dx, dy); //整体宽度,注意是整体,包括在显示区域之外 //滚动条表示总范围 int...float proportion = (float) (offset * 1.0 / (range - extent)); //计算滚动宽度 float transMaxRange =...parentLayout.getWidth() - childline.getWidth(); //设置滚动条移动 childline.setTranslationX(transMaxRange

1.8K30

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

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

2K30

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

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

2.6K10

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

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

2K20

recyclerView 进阶知识

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

1.1K40

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

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

1.6K10
领券