是否可以在RecyclerView中动态更改视图类型?

时间:2016-03-08 11:52:13

标签: c# android xamarin android-recyclerview

我有一个RecyclerView有两种类型的视图,我想在一个事件被触发时将Recycler视图中类型1的单项视图更改为类型2。

以下是创建视图持有者的代码

public override RecyclerView.ViewHolder OnCreateViewHolder (ViewGroup parent, int viewType)
{
    View itemView = null;
    ItemViewHolder vh = null;
    switch (viewType) {
    case FILE_UPLOADING:
        itemView = LayoutInflater.From (parent.Context).Inflate (Resource.Layout.ItemCardViewUploading, parent, false);
        vh = new UploadingItemViewHolder (itemView, OnClick, OnItemMenuClick);
        break;
    case FILE_DEFAULT:
        itemView = LayoutInflater.From (parent.Context).Inflate (Resource.Layout.ItemCardView, parent, false);
        vh = new ItemViewHolder (itemView, OnClick, OnItemMenuClick);
        break;
    }

    return vh;
}

创建UploadingItemViewHolder时,正在上传文件,上传完成后会触发一个事件,我想更改最初添加UploadingItemViewHolder的项目的外观看起来像默认ItemViewHolder

是否可以动态更改视图类型,还是必须删除旧项目并添加新项目?

修改

GetItemViewType()方法:

public override int GetItemViewType (int position)
{
    if (itemList [position].Hash == null) //If hash is null, then the item upload is in progress
        return FILE_UPLOADING;
    return FILE_DEFAULT;
}

4 个答案:

答案 0 :(得分:1)

我正在使用RecyclerView,删除和更新工作都很顺利。

  1. 删除:从RecyclerView

    中删除项目有4个步骤
    • Array ( [0] => Array ( [cat] => 6 [products] => Array ( [0] => 3 [1] => 4 ) ) [1] => Array ( [cat] => 7 [products] => 9 ) )
    • list.remove(position);
    • recycler.removeViewAt(position);
    • mAdapter.notifyItemRemoved(position);
  2. 这些代码对我有用。

    1. 更新数据:我唯一需要做的就是

      • mAdapter.notifyItemRangeChanged(position, list.size());
    2. 您必须在Activity / Fragment代码中执行所有这些操作,而不是在RecyclerView适配器代码中。

      希望它有所帮助!

答案 1 :(得分:1)

在onBindViewHolder()

if (holder instanceof ItemViewHolder) {
   //data with itemviewholder
}else{
 //uploading items
}

上传完成后

 itemList [position].Hash = new Hash(); //to make it not null
 adaper.notifyItemChanged(position);

答案 2 :(得分:1)

我建议采用另一种方法:ViewSwitcher用于处理两个视图之间的切换(两个以上,使用ViewFlipper),这样您就可以定义一个类型和一个ViewHolder,并定义您的项目为ViewSwitcher。然后,您只需在上传完成后触发切换。

public override RecyclerView.ViewHolder OnCreateViewHolder (ViewGroup parent, int viewType)
{
  ViewSwitcher itemView = new ViewSwitcher(parent.Context);
  itemView.addView(LayoutInflater.From(parent.Context).Inflate (Resource.Layout.ItemCardViewUploading, parent, false), 0, null);
  itemView.addView(LayoutInflater.From (parent.Context).Inflate (Resource.Layout.ItemCardView, parent, false), 0, null);
  return new ItemViewHolder(itemView, OnClick, OnItemMenuClick);
}

// you may want to change parameter to fit the way you identify your file
public void onUploadCompleted(long itemId)
{
  ItemViewHolder vh = (ItemViewHolder) findViewHolderForItemId(itemId);
  ((ViewSwitcher) vh.itemView).showNext();
}

答案 3 :(得分:0)

您在适配器中尝试此实现:

@Override
    public int getItemViewType(int position) {

        int inputtype =0;

        if(position ==0)
        {
            inputtype =1;
        }
        else
        {
            inputtype =2;

        }

        return super.getItemViewType(position);
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(viewType==1)
        {
            View view = inflator.inflate(R.layout.layout1, parent, false);
            return new ViewHolder1(view); 
        }
        else
        {
            View view = inflator.inflate(R.layout.layout2, parent, false);
            return new ViewHolder2(view);  

        }

    }