草庐IT

java - 如何以编程方式更改 RecyclerView 项目属性,特别是 recyclerview 项目内的自定义 View

coder 2023-12-16 原文

我正在做一些作业并想做以下事情:我在列表中的对象有一个值标签。我想根据标签值在 recyclerview 项目布局中显示/隐藏自定义 View 。我们的想法是使用它在 recyclerview 项目上画一条线,以标记它们已连接,而不管基于标签值与该线的位置如何。

我在以前的项目中使用了 setVisibility(View.GONE) 并且它适用于简单的 View ,但是无论我把代码放在哪里以及如何放置,它在这个例子中都不起作用。

这些是 recyclerview 项目 View 中的自定义 View (lineTextViewTopHalflineTextViewBottomHalf)

    <LinearLayout

        android:layout_width="2dp"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <com.example.taskmodel.view.LineTextView
            android:id="@+id/lineTextViewTopHalf"
            android:layout_width="2dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />

        <com.example.taskmodel.view.LineTextView
            android:id="@+id/lineTextViewBottomHalf"
            android:layout_width="2dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
    </LinearLayout>

lineTextViewTop/BottomHalf 按预期绘制


public class LineTextView extends AppCompatTextView {

    private Paint paint = new Paint();
    //constructors

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.parseColor("#000000"));
        paint.setStrokeWidth(2);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawLine(0, 0, 0, getHeight(), paint);
    }
}

这是来 self 正在尝试的适配器类,所以让它显示/隐藏,但它没有(//代码什么都不做)


@Override
    public void onBindViewHolder(@NonNull final ElementHolder holder, final int position) {

        holder.tv1.setText(elementModels.get(position).getB());
        holder.tv2.setText(String.valueOf(elementModels.get(position).getA()));
        holder.tv3.setText(String.valueOf(elementModels.get(position).getC()));

        //this code does nothing, tested to be 1
        if(elementModels.get(position).getTag().equals("1")) {
            holder.lineTextViewTopHalf.setVisibility(View.GONE);

        }
    }

即使我在适配器类周围移动代码,我也没有得到任何东西。

class ElementHolder extends RecyclerView.ViewHolder {

        TextView tv1;
        TextView tv2;
        TextView tv3;
        LineTextView lineTextViewTopHalf;
        LineTextView lineTextViewBottomHalf;


        public ElementHolder(@NonNull View itemView, List<ElementModel> elementModels) {

            super(itemView);

            int position = itemView.getVerticalScrollbarPosition();
            tv1 = itemView.findViewById(R.id.tvNaziv);
            tv2 = itemView.findViewById(R.id.tvPocetak);
            tv3 = itemView.findViewById(R.id.tvKraj);
            lineTextViewTopHalf = itemView.findViewById(R.id.lineTextViewTopHalf);
            lineTextViewBottomHalf = itemView.findViewById(R.id.lineTextViewBottomHalf);


            //this code does nothing, and position is tested to be 0
            if(position == 0) {
                lineTextViewTopHalf.setVisibility(View.GONE);
            } else if (position == elementModels.size()) {
                lineTextViewBottomHalf.setVisibility(View.GONE);
            }
        }
    }

我原以为代码会按预期运行并使 View 显示/隐藏,但我被卡住了。任何帮助,将不胜感激。如果没有显示语法高亮,请见谅,第一次提问(不过我发帖的时候确实用了xml,java标签,错了会尝试修改)

编辑:我设法找出它没有按预期更新的原因。我的适配器类正在实现一个 callback,我需要一个 Handler 来更新 UI,这不能通过 callback 实现来完成。 感谢大家的贡献!

最佳答案

在您第一次接触时,尝试在 onBindViewHolder 中隐藏 lineTextView 是正确的方法。它没有用,因为不知何故你的条件从未匹配过

if(elementModels.get(position).getTag().equals("1")) 

然后代码 GONE lineTextViewTopHalf 从未触及

请尝试使用简单的条件并先检查 lineTextView 是否能够隐藏,然后再次检查您的条件

if(position == 0) {
        holder.lineTextViewTopHalf.setVisibility(View.GONE);
} else if ((position == 1) {
       holder.lineTextViewBottomHalf.setVisibility(View.GONE);    
}

关于java - 如何以编程方式更改 RecyclerView 项目属性,特别是 recyclerview 项目内的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797023/

有关java - 如何以编程方式更改 RecyclerView 项目属性,特别是 recyclerview 项目内的自定义 View的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  8. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  10. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

随机推荐