我正在做一些作业,并且想要执行以下操作:列表中的对象具有一个值Tag。我想根据标记值在recyclerview
项布局中显示/隐藏自定义 View 。这个想法是用它在recyclerview
项上画一条线,以根据Tag值将它们标记为已连接,而不管该线的位置。
我在以前的项目中使用了setVisibility(View.GONE)
,它在简单的 View 上工作,但是无论我在哪里放置代码,在此示例中都不能使用它。
这些是recyclerview
项目 View 中的自定义 View ,这些 View 被夸大了(lineTextViewTopHalf
和lineTextViewBottomHalf
)
<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);
}
}
}
我期望代码按预期方式运行并使 View 显示/隐藏,但是我被卡住了。任何帮助,将不胜感激。如果语法重点未显示,请原谅我,这是我的第一个问题(但我在发布时确实使用了
xml
,java
标记,如果输入错误,将尝试进行编辑)编辑:我设法找出为什么它没有按预期更新。我的适配器类正在实现
callback
,我需要一个Handler
来更新UI,但这不能通过callback
实现来完成。谢谢大家的贡献!
最佳答案
在您的第一种方法中,尝试在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);
}
关于java - 如何以编程方式更改RecyclerView项目属性,尤其是recyclerview项目内部的自定义 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57797023/