Android 如何动态更改ListView/RecyclerListView中项目的内容
在我的应用程序中,用户可以添加产品,当他们添加产品时,他们会返回到产品列表,这是一个包含CardView项目的RecyclerView视图 该规范规定,如果我上传7个图像或产品,则应在RecyclerView上方显示标题并显示进度,如“上传7个项目中的1个”、“上传7个项目中的2个”等。然后它应该消失,listview应该恢复正常 我尝试将标题视图附加到RecyclerView(并成功),我可以更新它的内容并隐藏它,但每当我隐藏它时,都会有一个空的空间,我无法使listview返回到其原始位置,我尝试了很多方法,我甚至将其设为空,重新构建它,并重新设置适配器。。。没什么帮助 所以我决定为RecyclerView.Adapter引入两种类型的项——TYPE\u头和TYPE\u产品Android 如何动态更改ListView/RecyclerListView中项目的内容,android,listview,android-listview,android-recyclerview,Android,Listview,Android Listview,Android Recyclerview,在我的应用程序中,用户可以添加产品,当他们添加产品时,他们会返回到产品列表,这是一个包含CardView项目的RecyclerView视图 该规范规定,如果我上传7个图像或产品,则应在RecyclerView上方显示标题并显示进度,如“上传7个项目中的1个”、“上传7个项目中的2个”等。然后它应该消失,listview应该恢复正常 我尝试将标题视图附加到RecyclerView(并成功),我可以更新它的内容并隐藏它,但每当我隐藏它时,都会有一个空的空间,我无法使listview返回到其原始位置,
现在我正在实现这一点,但我突然想到,我不知道如何动态更新类型为_HEADER的项中的TextView(我正在使用一个从uploader服务接收消息的处理程序,但我不知道如何访问RecycleView.Adapter中的TYPE_头项,以便动态更改其TextView。我正在使用RecycleView,我需要一个可以随listview向上滚动的头。我尝试了各种可能的解决方案,可以创建平滑效果,向上滚动时无额外空间 工作解决方案 我将标题作为listview的一部分。因此,您也可以做同样的事情,当您需要标题时,将其作为列表视图中位置0的一个项目,并从位置1开始实际的listview 当您不需要它时,只需删除位置0处的项目即可 这不会给你带来额外的空间或其他问题 此外,您还可以在RecycleAdapter中的bindView()中更新其中的Textview 已编辑 例如,您有一个广播接收器(或者,它可以是一个按钮点击或任何其他事件),它表示现在是时候更新HeaderView中的TextView了
在该接收器中,您实际上可以将全局标志设置为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视图。相反,让活动直接从适配器获取HeaderView
然后,您的活动可以直接从适配器获取
HeaderViewHolder
,并根据需要进行更新。为什么要在ListView/RecyclerView中执行此操作?标题是列表中的第一项。如果您滚动了列表,此标题将不可见。使用RelativeLayout
wi不是更简单吗将此“标题”作为顶部项目,然后根据进度简单地显示/隐藏它?或者我理解您的要求有误吗?我想我已经尝试过了(上次我做此工作是两个月前)但我不确定。我已经完全忘记了这个想法,我会尝试一下!谢谢!这个解决方案很有效,非常感谢!没问题。很高兴能提供帮助。你能详细说明一下这一部分吗->另外,你可以在bindView()中更新其中的Textview在RecycleAdapter中。如果列表已滚动,因此第一个可见位置不是0,则此操作将不起作用。如果您确实必须这样做,则还需要将列表滚动到顶部。这可能是一个糟糕的用户体验,也可能不是,但这取决于您自己。我个人决不会这样做。使用vi的RelativeLayout
我会选择上面标有layout_=“@+id/listview”
的ew,然后在需要时更改可见性。这样,列表就不必滚动。