如何动态更改ListView / RecyclerListView中项目的内容

时间:2015-08-21 14:12:16

标签: android listview android-listview android-recyclerview

在我的应用程序中,用户可以添加产品,当他们这样做时,他们会回到产品列表,这是一个带有CardView项目的RecyclerView。

规范说如果我上传7个图像或产品,则应在RecyclerView上方显示标题并显示进度,如“上传7个项目中的1个”,“上传7个项目中的2个”等等。然后它应该消失,列表视图应该恢复正常。

我尝试将标题视图(并且已成功)附加到RecyclerView,我能够更新其内容并隐藏它,但每当我隐藏它时,仍然留有空白区域,我无法使列表视图恢复到原来的位置,我尝试了很多东西,我甚至把它变成了null,并重新构建了一个新的东西,并重新设置了适配器......没有任何帮助。

所以我决定为RecyclerView.Adapter介绍两种类型的项目 - TYPE_HEADER和TYPE_PRODUCT 现在我正在实现这个,但我想到我不知道如何动态更新TYPE_HEADER项目中的TextView(我使用的处理程序接收来自上传服务的消息,但我不知道如何到达TYPE_HEADER项目在RecyclerView.Adapter中,以便动态更改其TextView。

2 个答案:

答案 0 :(得分:1)

我正在使用 RecycleView ,我需要一个可以使用listview向上滚动的标题。我尝试了所有可能的解决方案,这些解决方案可以在向上滚动时创建平滑效果并且没有额外空间。

工作解决方案

我将标题作为listview的一部分。因此,您可以执行相同的操作,当您需要标题时,在列表视图中将其设置为位置0 的项目,并从位置1开始实际列表视图。

当您不需要时,您只需删除位置0处的项目。

这不会给你带来额外空间或其他问题。

此外,您可以在RecycleAdapter中的bindView()中更新其中的Textview。

<强> EDITED

对于一个例子,你有一个广播接收器(或者,它可以是一个按钮点击或任何其他事件)现在说它是时候更新HeaderView内的TextView。

在那个Receiver中,您实际上可以将全局标志设置为true,notifyDataSetChanged(),然后在RecycleAdapter.onBindViewHolder中,根据您的全局标志值,您可以更新TextView。

答案 1 :(得分:1)

由于您知道只需要一个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中的标题视图。相反,让活动直接从适配器获取HeaderView

然后,您的活动可以直接从适配器获取HeaderViewHolder,并根据需要进行更新。