我在项目中实施了recyclerView
。
我的Button
recyclerView
中有一个row
。我的每一行recyclerView
的代码都是这样的:
savedmessage_custom_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="4dp"
android:background="#ffffff"
android:orientation="vertical">
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="Dummy text" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
android:visibility="gone"/>
</LinearLayout>
按钮的可见性为gone
。我想将此按钮的可见性更改为“可见&#39;当有人点击其上方的message
textView
时。我在onClickLiestener()
上实施了一个简单的message (textView)
,并在点击button
时更改了message
的可见性。我知道那不会起作用,但我想看看结果。结果很奇怪。如果我单击第1行的textView,第7,17,19行等按钮也变为可见。我猜这可能是对viewHolder的缓存。
MyViewHolder是这样的:
class MyViewHolder extends RecyclerView.ViewHolder {
TextView message;
public MyViewHolder(final View itemView) {
super(itemView);
message = (TextView) itemView.findViewById(R.id.message);
message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemView.findViewById(R.id.button).setVisibility(View.VISIBLE);
}
});
}
}
有人可以指导我如何更改我的recyclerView按钮的可见性,仅限的?
答案 0 :(得分:11)
将点击逻辑移离ViewHolder:
class MyViewHolder extends RecyclerView.ViewHolder {
TextView message;
Button button;
public MyViewHolder(View itemView) {
super(itemView);
message = (TextView) itemView.findViewById(R.id.message);
button = (Button) itemView.findViewById(R.id.button);
}
}
并将其放在适配器的onBindViewHolder方法中:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.button.setVisibility(View.GONE);
holder.message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.button.setVisibility(View.VISIBLE);
}
});
}
RecyclerView会重复使用ViewHolder,这就是您在其他行中看到该按钮的原因。
答案 1 :(得分:0)
试试这个。 删除Visiblity =从XML中删除。 将MyViewHOlder构造函数更改为;
public MyViewHolder(final View itemView) {
super(itemView);
message = (TextView) itemView.findViewById(R.id.message);
button =(Button)itemView.findViewById(R.id.button);
button.setVisibility(View.Gone);
message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button.setVisibility(View.VISIBLE);
}
});
}
另一种方式; 仍然没有Visibility = Gone in XML
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.message.setOnClickListener(new View.OnCLickListener{
@Override
public void onClick(View v){
holder.button.setVisibiltiy(View.VISIBLE);
}
});
holder.button.setVisibity(View.GONE);
}
答案 2 :(得分:0)
是的,它正在回收视图,所以这件事情正在发生。 为此,您必须创建全局变量
ArrayList<Boolean> isClicked = new ArrayList<>();
并保存值isClicked。
和onBindView持有者这样做:
if(isClicked.get(position)){
view.setvisiblity(View.VISIBLE);
}else{
view.setvisiblity(View.GONE);
}
和 OnClickListener 在arraylist中保存值以及设置visiblity。
答案 3 :(得分:-1)
您需要管理visibility
方法button
中特定行的特定@Override
的{{1}},而不是初始化时间。
答案 4 :(得分:-3)
喜欢这个
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView message;
Button btnShow;
public MyViewHolder(final View itemView) {
super(itemView);
itemView.setOnClickListener(this);
message = (TextView) itemView.findViewById(R.id.message);
btnShow = (Button) itemView.findViewById(R.id.button);
}
@Override
public void onClick(View v) {
btnShow.setVisibility(View.VISIBLE);
}
}