如何动态更改 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,并按需更新。