如何动态更改 ListView/RecyclerListView 中项目的内容
How to dynamically change the content of an item in a ListView/RecyclerListView
在我的应用程序中,用户可以添加产品,当他们添加产品时,他们会返回产品列表,这是一个带有 CardView 项目的 RecyclerView。
规范说,如果我上传7张图片或产品,RecyclerView上方应该出现一个header并显示进度,如"Uploading 1 of 7 items"、"Uploading 2 of 7 items"等向前。然后它应该消失,列表视图应该恢复正常。
我尝试将 header 视图(并成功)附加到 RecyclerView,并且我能够更新其内容并隐藏它,但是每当我隐藏它时,都会留下一个空的 space在那里,我无法让列表视图回到原来的位置,我尝试了很多东西,我什至把它设为空,然后重新构建它,并重新设置适配器...没有任何帮助。
所以我决定为 RecyclerView.Adapter 引入两种类型的项目 - TYPE_HEADER 和 TYPE_PRODUCT
现在我正在实现这个,但我突然想到我不知道如何动态更新 TYPE_HEADER 项目内的 TextView(我正在使用从上传服务接收消息的处理程序,但我不知道如何到达 RecyclerView.Adapter 中的 TYPE_HEADER 项以动态更改其 TextView。
我正在使用 RecycleView,我需要一个 header 可以使用列表视图向上滚动。我尝试了所有可能的解决方案,这些解决方案可以产生平滑的效果,并且当您向上滚动时没有额外的 space。
工作解决方案
我将 header 作为列表视图的一部分。因此,您可以做同样的事情,当您需要 header 时,将其设为列表视图中 位置 0 的项目,并从位置 1 开始您的实际列表视图。
当你不需要它时,你可以删除位置 0 的项目。
这不会给您带来任何问题,例如 Extra space 或其他问题。
此外,您可以在 RecycleAdapter 中的 bindView() 中更新其中的 Textview。
已编辑
例如,您有一个广播接收器(或者,它可以是按钮单击或任何其他事件),它表示现在是时候更新 HeaderView 中的 TextView 了。
在该 Receiver 中,您实际上可以将全局标志设置为 true,notifyDataSetChanged(),然后在您的 RecycleAdapter.onBindViewHolder 中,根据您的全局标志的值,您可以更新 TextView。
因为你知道你只需要一个 HEADER 类型的视图,你可以在适配器中挂起它:
private HeaderViewHolder headerView;
public HeaderViewHolder getHeaderViewHolder()
{
return headerView;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
if(viewType == TYPE_HEADER)
{
if(headerView == null)
{
View view = getLayoutInflater().inflate(R.layout.header, parent, false);
headerView = new HeaderViewHolder(view);
}
return headerView;
}
else
{
//Inflate view normally...
}
}
然后您可以忽略 onBindViewHolder
中的 header 视图。相反,让 activity 直接从适配器
获取 HeaderView
然后你的activity可以直接从适配器获取HeaderViewHolder
,并按需更新。
在我的应用程序中,用户可以添加产品,当他们添加产品时,他们会返回产品列表,这是一个带有 CardView 项目的 RecyclerView。
规范说,如果我上传7张图片或产品,RecyclerView上方应该出现一个header并显示进度,如"Uploading 1 of 7 items"、"Uploading 2 of 7 items"等向前。然后它应该消失,列表视图应该恢复正常。
我尝试将 header 视图(并成功)附加到 RecyclerView,并且我能够更新其内容并隐藏它,但是每当我隐藏它时,都会留下一个空的 space在那里,我无法让列表视图回到原来的位置,我尝试了很多东西,我什至把它设为空,然后重新构建它,并重新设置适配器...没有任何帮助。
所以我决定为 RecyclerView.Adapter 引入两种类型的项目 - TYPE_HEADER 和 TYPE_PRODUCT 现在我正在实现这个,但我突然想到我不知道如何动态更新 TYPE_HEADER 项目内的 TextView(我正在使用从上传服务接收消息的处理程序,但我不知道如何到达 RecyclerView.Adapter 中的 TYPE_HEADER 项以动态更改其 TextView。
我正在使用 RecycleView,我需要一个 header 可以使用列表视图向上滚动。我尝试了所有可能的解决方案,这些解决方案可以产生平滑的效果,并且当您向上滚动时没有额外的 space。
工作解决方案
我将 header 作为列表视图的一部分。因此,您可以做同样的事情,当您需要 header 时,将其设为列表视图中 位置 0 的项目,并从位置 1 开始您的实际列表视图。
当你不需要它时,你可以删除位置 0 的项目。
这不会给您带来任何问题,例如 Extra space 或其他问题。
此外,您可以在 RecycleAdapter 中的 bindView() 中更新其中的 Textview。
已编辑
例如,您有一个广播接收器(或者,它可以是按钮单击或任何其他事件),它表示现在是时候更新 HeaderView 中的 TextView 了。
在该 Receiver 中,您实际上可以将全局标志设置为 true,notifyDataSetChanged(),然后在您的 RecycleAdapter.onBindViewHolder 中,根据您的全局标志的值,您可以更新 TextView。
因为你知道你只需要一个 HEADER 类型的视图,你可以在适配器中挂起它:
private HeaderViewHolder headerView;
public HeaderViewHolder getHeaderViewHolder()
{
return headerView;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
if(viewType == TYPE_HEADER)
{
if(headerView == null)
{
View view = getLayoutInflater().inflate(R.layout.header, parent, false);
headerView = new HeaderViewHolder(view);
}
return headerView;
}
else
{
//Inflate view normally...
}
}
然后您可以忽略 onBindViewHolder
中的 header 视图。相反,让 activity 直接从适配器
然后你的activity可以直接从适配器获取HeaderViewHolder
,并按需更新。