Android: 改变视图在 recyclerView 中的可见性
Android: Changing visibility of a view in recyclerView
我在我的项目中实现了一个recyclerView
。
我的 recyclerView
row
中有一个 Button
。我的 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
。当有人点击它上方的 message
textView
时,我想将此按钮的可见性更改为 'visible'。我在 message (textView)
上实现了一个简单的 onClickLiestener()
,并在单击 message
时更改了 button
的可见性。我知道这行不通,但我想看看结果。结果很奇怪。如果我单击第 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?
您需要在 @Override
方法 onBindViewHolder
中而不是在初始化时管理特定行的特定 button
的 visibility
。
喜欢这样
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);
}
}
试试这个。
从 XML 中删除 Visibility=gone。
将 ViewHOlder 构造函数更改为;
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);
}
});
}
另一种方式;
在 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);
}
将点击逻辑从 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);
}
});
}
ViewHolder 被 RecyclerView 重复使用,这就是您在其他行中看到按钮可见的原因。
是的,它正在回收视图,所以这件事正在发生。
为此你必须创建全局变量
ArrayList<Boolean> isClicked = new ArrayList<>();
并保存值 isClicked。
和 onBindView 持有者放了这样的东西:
if(isClicked.get(position)){
view.setvisiblity(View.VISIBLE);
}else{
view.setvisiblity(View.GONE);
}
和 OnClickListener 将值保存在数组列表中并设置可见性。
我在我的项目中实现了一个recyclerView
。
我的 recyclerView
row
中有一个 Button
。我的 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
。当有人点击它上方的 message
textView
时,我想将此按钮的可见性更改为 'visible'。我在 message (textView)
上实现了一个简单的 onClickLiestener()
,并在单击 message
时更改了 button
的可见性。我知道这行不通,但我想看看结果。结果很奇怪。如果我单击第 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?
您需要在 @Override
方法 onBindViewHolder
中而不是在初始化时管理特定行的特定 button
的 visibility
。
喜欢这样
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);
}
}
试试这个。 从 XML 中删除 Visibility=gone。 将 ViewHOlder 构造函数更改为;
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);
}
});
}
另一种方式; 在 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);
}
将点击逻辑从 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);
}
});
}
ViewHolder 被 RecyclerView 重复使用,这就是您在其他行中看到按钮可见的原因。
是的,它正在回收视图,所以这件事正在发生。 为此你必须创建全局变量
ArrayList<Boolean> isClicked = new ArrayList<>();
并保存值 isClicked。
和 onBindView 持有者放了这样的东西:
if(isClicked.get(position)){
view.setvisiblity(View.VISIBLE);
}else{
view.setvisiblity(View.GONE);
}
和 OnClickListener 将值保存在数组列表中并设置可见性。