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

标签 java android android-layout android-recyclerview

我正在做一些作业并想做以下事情:我在列表中的对象有一个值标签。我想根据标签值在 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 - 为什么不能在 Java 中将 float[] 转换为 double[]?

Java 暴击位树

java - 使用 HttpsUrlConnection 重用 TCP 连接

android - 过渡期间以图 block 绘制的场景过渡图像

java - Jmap 无法连接进行转储

java.lang.ClassNotFoundException : oracle. jdbc.driver.OracleDriver--ojdbc8不是本地计算机

java - 无法在 Android KitKat 上将 txt 文件写入 SD 卡

android - 查看 getRootView 返回自身

android - 为什么这些按钮在 TableLayout 中没有对齐?

android - 自定义进度对话框动画