Recycler 视图的可重用性为 view_holder。如何保持特定位置项目的可见性?
Recycler view reusability of view_holder. How to hold visibility of item of particular position?
这是在关于在特定位置重复按钮视图的问题中发布的答案。代码工作正常。我的疑问是即使在 recyclerview 中滚动后如何保持第一项的可见性?
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);
}
});
}
设置与每个项目关联的布尔变量数组。
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
if(visibilityList.get(position)){
holder.button.setVisibility(View.VISIBLE);
}else{
holder.button.setVisibility(View.GONE);
}
holder.message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(visibilityList.get(position)){
visibilityList.set(position, false);
holder.button.setVisibility(View.GONE);
}else{
visibilityList.set(position, true);
holder.button.setVisibility(View.VISIBLE);
}
}
});
}
注意:visibilityList 是 List 变量,其中每个值都设置为默认值(根据您的要求设置为 true 或 false)
使用HashMap 保留那些你需要显示的位置。在onBindViewHolder
方法中编写代码
if(map.contains(holder.getAdapterPosition()){
holder.btn.setVisibility(View.VISIBLE);
} else {
holder.btn.setVisibility(View.GONE);
}
注意:-也要写else case,否则recyclerView会因为可重用性而出现异常。
我假设在您的适配器中,您拥有一个对象数组,代表您要显示的项目。
为这个对象添加一个 属性,例如 ButtonVisible
,并在按下按钮时设置 属性。
完整的示例适配器如下。这将显示一个带有按钮的项目列表,按下该按钮时将变为不可见。无论列表中有多少项目或滚动多少,都会记住可见性。
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> {
public static class MyData {
public boolean ButtonVisible = true;
public String Text;
public MyData(String text) {
Text = text;
}
}
public List<MyData> items = new ArrayList<>();
public TestAdapter() {
this.items.add(new MyData("Item 1"));
this.items.add(new MyData("Item 2"));
this.items.add(new MyData("Item 3"));
}
@Override
public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) {
return new VH((
LayoutInflater.from(parent.getContext())
.inflate(R.layout.test_layout, parent, false))
);
}
@Override
public void onBindViewHolder(TestAdapter.VH holder, final int position) {
final MyData itm = items.get(position);
holder.button.setVisibility(itm.ButtonVisible ? View.VISIBLE : View.GONE);
holder.text.setText(itm.Text);
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
itm.ButtonVisible = false;
notifyItemChanged(position);
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class VH extends RecyclerView.ViewHolder {
Button button;
TextView text;
public VH(View itemView) {
super(itemView);
button = itemView.findViewById(R.id.toggle);
text = itemView.findViewById(R.id.text1);
}
}
}
test_layout.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="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
这是在关于在特定位置重复按钮视图的问题中发布的答案。代码工作正常。我的疑问是即使在 recyclerview 中滚动后如何保持第一项的可见性?
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);
}
});
}
设置与每个项目关联的布尔变量数组。
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
if(visibilityList.get(position)){
holder.button.setVisibility(View.VISIBLE);
}else{
holder.button.setVisibility(View.GONE);
}
holder.message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(visibilityList.get(position)){
visibilityList.set(position, false);
holder.button.setVisibility(View.GONE);
}else{
visibilityList.set(position, true);
holder.button.setVisibility(View.VISIBLE);
}
}
});
}
注意:visibilityList 是 List 变量,其中每个值都设置为默认值(根据您的要求设置为 true 或 false)
使用HashMap 保留那些你需要显示的位置。在onBindViewHolder
方法中编写代码
if(map.contains(holder.getAdapterPosition()){
holder.btn.setVisibility(View.VISIBLE);
} else {
holder.btn.setVisibility(View.GONE);
}
注意:-也要写else case,否则recyclerView会因为可重用性而出现异常。
我假设在您的适配器中,您拥有一个对象数组,代表您要显示的项目。
为这个对象添加一个 属性,例如 ButtonVisible
,并在按下按钮时设置 属性。
完整的示例适配器如下。这将显示一个带有按钮的项目列表,按下该按钮时将变为不可见。无论列表中有多少项目或滚动多少,都会记住可见性。
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> {
public static class MyData {
public boolean ButtonVisible = true;
public String Text;
public MyData(String text) {
Text = text;
}
}
public List<MyData> items = new ArrayList<>();
public TestAdapter() {
this.items.add(new MyData("Item 1"));
this.items.add(new MyData("Item 2"));
this.items.add(new MyData("Item 3"));
}
@Override
public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) {
return new VH((
LayoutInflater.from(parent.getContext())
.inflate(R.layout.test_layout, parent, false))
);
}
@Override
public void onBindViewHolder(TestAdapter.VH holder, final int position) {
final MyData itm = items.get(position);
holder.button.setVisibility(itm.ButtonVisible ? View.VISIBLE : View.GONE);
holder.text.setText(itm.Text);
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
itm.ButtonVisible = false;
notifyItemChanged(position);
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class VH extends RecyclerView.ViewHolder {
Button button;
TextView text;
public VH(View itemView) {
super(itemView);
button = itemView.findViewById(R.id.toggle);
text = itemView.findViewById(R.id.text1);
}
}
}
test_layout.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="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>