jjzjj

android - 像 Snapchat-Discover 这样的 Spannable RecyclerView

coder 2023-11-21 原文

我正在尝试使用 TwoWayView 库创建一个如下图所示的可跨越式 recyclerView:https://github.com/lucasr/twoway-view

但我无法获得所需的 View ,并且遗漏了一些空单元格。

        final SpannableGridLayoutManager.LayoutParams lp = (SpannableGridLayoutManager.LayoutParams) itemView.getLayoutParams();

        //final int span1 = (itemId == 0 || itemId == 3 ? 2 : 1);
        //final int span2 = (itemId == 0 ? 2 : (itemId == 3 ? 3 : 1));

        int span1 = 0; //h
        int span2 = 0; //w

        switch(itemId)
        {
        case 0:
            span1 = 2;
            span2 = 1;
            break;

        case 1:
            span1 = 2;
            span2 = 1;
            break;

        case 2:
            span1 = 2;
            span2 = 1;
            break;

        case 3:
            span1 = 3;
            span2 = 1;
            break;

        case 4:
            span1 = 3;
            span2 = 1;
            break;

        case 5:
            span1 = 4;
            span2 = 3;
            break;

        case 6:
            span1 = 2;
            span2 = 1;
            break;

        case 7:
            span1 = 2;
            span2 = 1;
            break;

        case 8:
            span1 = 2;
            span2 = 1;
            break;

        case 9:
            span1 = 2;
            span2 = 1;
            break;

        case 10:
            span1 = 4;
            span2 = 3;
            break;
        }

        final int colSpan = span2;
        final int rowSpan = span1;

        if (lp.rowSpan != rowSpan || lp.colSpan != colSpan) 
        {
            lp.rowSpan = rowSpan;
            lp.colSpan = colSpan;
            itemView.setLayoutParams(lp);
        }

XML:

<org.lucasr.twowayview.widget.TwoWayView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    style="@style/TwoWayView"
    app:twowayview_layoutManager="ListLayoutManager"/>

引用:

编辑 1 我能够通过将 XML 中的 rowWidth 更改为 12 和以下跨度来解决此问题:

        //PADDING-- left / top / right / bottom
    switch(itemId%11)
    {
    case 0:
        span1 = 4;
        span2 = 7;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 1:
        span1 = 4;
        span2 = 7;
        //holder.cont_frienddetail.setPadding(dpAsPixels2, dpAsPixels1, dpAsPixels2, dpAsPixels1);
        break;

    case 2:
        span1 = 4;
        span2 = 7;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 3:
        span1 = 4;
        span2 = 7;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 4:
        span1 = 8;
        span2 = 14;
        //holder.cont_frienddetail.setPadding(dpAsPixels2, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 5:
        span1 = 4;
        span2 = 7;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 6:
        span1 = 6;
        span2 = 10;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels2, dpAsPixels1);
        break;

    case 7:
        span1 = 6;
        span2 = 10;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 8:
        span1 = 8;
        span2 = 14;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels2, dpAsPixels1);
        break;

    case 9:
        span1 = 4;
        span2 = 7;
        ///holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;

    case 10:
        span1 = 4;
        span2 = 7;
        //holder.cont_frienddetail.setPadding(dpAsPixels0, dpAsPixels1, dpAsPixels0, dpAsPixels1);
        break;
    }

最佳答案

想象一下,使用您的示例图像并将每个单元格的垂直边界延伸到整个屏幕。如果这样做,您会看到有六列。这就是将解决您的问题的洞察力。

现在您可以使用常规的 RecyclerViewGridLayoutManager 来完成此操作,而不必依赖于修复 GitHub 库中的所有错误。

创建一个包含 6 列的 GridLayoutManager,然后指定一个自定义 SpanSizeLookup,这将使您的单元格具有不同的宽度。

在您的示例图像中,第一行中的三个单元格将分别跨越 2 列。第二行中两个较大的单元格各跨越 3 列。左下方的单元格跨越 4 列。

现在您所要做的就是创建一个 SpanSizeLookup 来设置正确的宽度。

    // Create a grid layout with 6 columns
    // (least common multiple of 2 and 3)
    GridLayoutManager layoutManager = new GridLayoutManager(this, 6);

    layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {

            int widthClass = determineWidth(position) // TODO here you figure out what the cell width should be

            switch (widthClass) {
            case SMALL:
                return 2;   // fits 3 per row

            case MEDIUM:
                return 3;   // fits 2 per row

            case LARGE:     // fits 2 per row, one LARGE and one SMALL
                return 4;

            default:
                throw new IllegalStateException("don\'t know about widthClass " + widthClass);
            }
        }
    });

您可以查看我对类似问题的原始回答here .

关于android - 像 Snapchat-Discover 这样的 Spannable RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195008/

有关android - 像 Snapchat-Discover 这样的 Spannable RecyclerView的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  3. ruby-on-rails - 像 "has_one"这样的 Rails 方法调用是如何工作的? - 2

    我是PHP开发人员,目前我正在学习Rails(3),当然还有Ruby。Idon'twanttobelieveinmagic因此,我尽可能多地了解Rails“背后”发生的事情。我发现有趣的是ActiveRecord模型中的方法调用,如has_one或belongs_to。我试图重现它,并提供了一个天真的例子:#has_one_test_1.rbmoduleFooclassBasedefself.has_oneputs'Willitwork?'endendendclassModel2如我所料,只要运行这个文件就会输出“Willitwork?”。在搜索Rails源代码时,我找到了负责的函数:

  4. ruby - 奇怪的 ruby​​ for 循环行为(为什么这样做有效) - 2

    defreverse(ary)result=[]forresult[0,0]inaryendresultendassert_equal["baz","bar","foo"],reverse(["foo","bar","baz"])这行得通,我想了解原因。有什么解释吗? 最佳答案 如果我使用each而不是for/in重写它,它看起来像这样:defreverse(ary)result=[]#forresult[0,0]inaryary.eachdo|item|result[0,0]=itemendresultendforainb基本上就

  5. ruby-on-rails - 为什么 Rails 使用像 link_to 这样的辅助方法而不是 <a href...>? - 2

    我正在学习Rails,我注意到Rails不断地使用诸如link_to之类的辅助方法,而不是仅仅使用普通的html。现在我可以理解为什么他们会使用他们会使用一些辅助方法,但我不明白为什么他们更喜欢辅助方法而不是直接编码html。为什么Rails更喜欢辅助方法而不是您必须手动编写html?为什么Rails团队做出这样的设计选择? 最佳答案 在Rails应用程序中,通常使用URL方法和内容方法生成链接,例如这绝对比将它们放入中更易于管理手动标记。">(您正在使用路由器生成这些URL,对吗?如果您硬编码/users/1并决定稍后将其设为/u

  6. ruby - Ruby 中有常量实例变量这样的东西吗? - 2

    我的googlefu很烂,找不到这方面的信息。基本上我想要一个实例变量,它只在类/模块的范围内可见,但也是不可变的。我是Ruby的新手,如果这个问题没有多大意义,我深表歉意。 最佳答案 classMyClassdefinitializeclass自然地,您会希望尽可能使用方法foo来读取值。一个更简单的等价物是classMyClassdefinitializedeffoo;1;endendend 关于ruby-Ruby中有常量实例变量这样的东西吗?,我们在StackOverflow上找到

  7. ruby - 有没有办法用 %w 创建一个像字符串这样的符号数组? - 2

    我可以通过%w(foobar)创建一个字符串数组。有没有类似的方法来创建符号数组? 最佳答案 只需按照以下步骤操作即可:%i(foobar)它从Ruby2.0.0开始可用。查看他们的官方NewsAdded%iand%Iforsymbollistcreation(similarto%wand%W). 关于ruby-有没有办法用%w创建一个像字符串这样的符号数组?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.

  8. ruby-on-rails - Errno::ENOENT - 没有这样的文件或目录@rb_sysopen - 2

    我正在尝试使用ruby​​onrails中的actionmailer发送电子邮件附件,但我一直收到此错误。问题似乎是它无法在我指定的目录中找到文件,但文件路径是有效的。我还在控制台中使用File.exist?检查了这一点,并确认提供的路径计算结果为真。这是我的邮件:classOrderMailer我还按照ActionMailer文档的建议安装了邮件gem来处理编码。任何帮助将不胜感激,-布莱恩 最佳答案 Rails.root返回一个Pathname对象。Pathname#+(string)将File.joinstring到路径ifi

  9. Ruby:如何编写像 map 这样的 bang 方法? - 2

    我想编写一些新的Array方法来改变调用对象,如下所示:a=[1,2,3,4]a.map!{|e|e+1}a=[2,3,4,5]...但我对如何执行此操作一无所知。我想我需要一个新的大脑。所以,我想要这样的东西:classArraydefstuff!#changethecallingobjectinsomewayendendmap!只是一个例子,我想写一个全新的,而不使用任何预先存在的!方法。谢谢! 最佳答案 编辑-更新答案以反射(reflect)对您问题的更改。classArraydefstuff!self[0]="a"enden

  10. 手机 & 电脑数据,这样删除才彻底! - 2

    恢复出厂设置后数据还在吗?格式化真的彻底吗?数据到底该怎么删?文章目录前言为什么不能彻底删除数据?手机如何彻底删除数据?第一步:恢复出厂设置第二步:手动覆写数据电脑如何彻底删除数据?方法一:命令提示符方法二:文件粉碎方法三:低级格式化硬盘总结前言个人数据安全再次成为大家关注的热门话题:在日常使用手机和电脑时,我们可能需要删除一些敏感数据,例如银行账户信息、个人照片、聊天记录等。数据删除的目的是保护个人隐私,避免泄露。以下是一些关于如何删除数据的方法。恢复出厂设置,不一定彻底清除手机数据电子产品迭代升级速度越来越快,大家家中的旧手机、旧电脑也越来越多,一键删除、格式化、恢复出厂设置能彻底清除个人

随机推荐