我有一个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;
}
答案 0 :(得分:1)
我正在使用RecyclerView,删除和更新工作都很顺利。
删除:从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);
这些代码对我有用。
更新数据:我唯一需要做的就是
mAdapter.notifyItemRangeChanged(position, list.size());
您必须在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);
}
}