如何以编程方式更改RecyclerView项目属性,尤其是recyclerview项目内部的自定义视图

时间:2019-09-05 00:27:47

标签: java android android-layout android-recyclerview

我正在做一些作业,并且想要执行以下操作:列表中的对象具有值Tag。我想根据标签值在recyclerview项布局中显示/隐藏自定义视图。想法是用它在recyclerview项上画一条线,以根据标记值将它们标记为已连接,而不管该线的位置。

我在以前的项目中使用过setVisibility(View.GONE),并且可以在简单的视图上使用,但是无论我将代码放在什么位置和放置方式如何,在此示例中都无法使用。

这些是recyclerview项目视图中的自定义视图(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);
    }
}

这是我试图在适配器类中显示/隐藏的,但是没有(//代码没有任何作用)


@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);
            }
        }
    }

我期望代码按预期运行并显示/隐藏视图,但是我被卡住了。任何帮助,将不胜感激。如果未显示语法高亮显示,请原谅我,这是有史以来第一个问题(但我在发布时确实使用了xmljava标签,如果输入有误,则会尝试进行编辑)

编辑:我设法找出为什么它没有按预期更新。我的适配器类正在实现callback,而我需要Handler来更新UI,但这无法通过callback实现来完成。 谢谢大家的贡献!

3 个答案:

答案 0 :(得分:1)

在您的第一种方法中,尝试在onBindViewHolder中隐藏lineTextView是正确的方法。这没用,因为您的病情永远无法匹配

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

然后将代码替换掉lineTextViewTopHalf从未触及的代码

请尝试简单的条件,首先检查lineTextView是否可以隐藏,然后再次检查条件

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

答案 1 :(得分:0)

@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()));


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

答案 2 :(得分:0)

请尝试下面的代码

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

并在您的onBindViewHolde方法中使用以下代码

if(elementModels.get(position).getTag().equals("1")) {
    holder.lineTextViewTopHalf.setVisibility(View.GONE);
    holder.lineTextViewBottomHalf.setVisibility(View.VISIBLE);
} else {
    holder.lineTextViewTopHalf.setVisibility(View.VISIBLE);
    holder.lineTextViewBottomHalf.setVisibility(View.GONE);
}